Je pense créer un outil de débogage pour mon application Java.
Je me demande s'il est possible d'obtenir une trace de pile, tout comme Exception.printStackTrace()
mais sans réellement lever une exception?
Mon objectif est, dans n'importe quelle méthode donnée, de vider une pile pour voir qui est l'appelant de la méthode.
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
stderr
, ce qui semble être l'implication de la question.Si vous voulez la trace uniquement pour le thread actuel (plutôt que pour tous les threads du système, comme le fait la suggestion de Ram), faites:
Thread.currentThread ().getStackTrace ()
Pour trouver l'appelant, procédez comme suit:
Et appelez cette méthode à partir de la méthode qui a besoin de savoir qui est son appelant. Cependant, un mot d'avertissement: l'index de la trame appelante dans la liste peut varier selon la JVM! Tout dépend du nombre de couches d'appels présents dans getStackTrace avant d'atteindre le point où la trace est générée. Une solution plus robuste serait d'obtenir la trace et de la parcourir à la recherche de la trame de getCallingMethodName, puis de faire deux pas plus loin pour trouver le véritable appelant.
la source
Vous pouvez obtenir une trace de pile comme ceci:
Si vous souhaitez accéder au cadre, vous pouvez utiliser t.getStackTrace () pour obtenir un tableau de cadres de pile.
Sachez que ce stacktrace (comme n'importe quel autre) peut manquer certaines images si le compilateur hotspot a été occupé à optimiser les choses.
la source
t.printStackTrace
part.printStackTrace(System.out)
.new Throwable().printStackTrace(System.out);
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Notez que Thread.dumpStack () lève en fait une exception:
la source
Vous pouvez également envoyer un signal à la JVM pour exécuter Thread.getAllStackTraces () sur un processus Java en cours d'exécution en envoyant un signal QUIT au processus.
Sous Unix / Linux:
kill -QUIT process_id
, où process_id est le numéro de processus de votre programme Java.Sous Windows, vous pouvez appuyer sur Ctrl-Pause dans l'application, bien que vous ne le verrez généralement pas sauf si vous exécutez un processus de console.
JDK6 a introduit une autre option, la commande jstack, qui affichera la pile de tout processus JDK6 en cours d'exécution sur votre ordinateur:
jstack [-l] <pid>
Ces options sont très utiles pour les applications qui s'exécutent dans un environnement de production et ne peuvent pas être modifiées facilement. Ils sont particulièrement utiles pour diagnostiquer les blocages d'exécution ou les problèmes de performances.
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
la source
Si vous avez besoin d'une sortie de capture
la source
Java 9 a introduit le
StackWalker
classes et les supports pour parcourir la pile.Voici quelques extraits de Javadoc:
la source
Profiler Java HPROF
Vous n'avez même pas à faire cela dans le code. Vous pouvez attacher le Java HPROF à votre processus et à tout moment appuyez sur Control- \ pour afficher le vidage de tas, exécuter des threads, etc. . . sans gâcher votre code d'application. C'est un peu obsolète, Java 6 est livré avec la jconsole GUI, mais je trouve toujours HPROF très utile.
la source
La réponse de Rob Di Marco est de loin la meilleure si vous êtes heureux de sortir
stderr
.Si vous souhaitez capturer vers un
String
, avec de nouvelles lignes selon une trace normale, vous pouvez le faire:la source