Est-il un moyen de vider une trace de la pile sans la levée d'une exception en java?
Je pense à la création d'un outil de débogage pour mon application Java.
Je me demande si il est possible d'obtenir une trace de la pile, tout comme Exception.printStackTrace()
mais sans réellement lancer une exception?
Mon objectif est d', dans toute méthode, de vidage de pile pour voir qui de la méthode de l'appelant est.
- C'est probablement mieux d'utiliser un outil de débogage. Il ya beaucoup de là-bas, et vous pouvez passer du temps à travailler sur le projet plutôt que de réinventer quelque chose. À moins que vous ayez le plaisir de l'écriture d'un débogueur, bien sûr.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également essayer
Thread.getAllStackTraces()
pour obtenir une carte de traces de pile pour tous les threads qui sont vivants.Oui, il suffit d'utiliser
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
Si vous voulez la trace juste pour le thread courant (plutôt que tous les threads du système, comme la suggestion de Ram ne), n':
Fil.currentThread().getStackTrace()
Pour trouver l'appelant, n':
Et appeler cette méthode à partir de la méthode qui a besoin de savoir qui à son appelant. Cependant, un mot d'avertissement: l'indice de l'appelant image dans la liste pourrait varier en fonction de la JVM! Tout dépend du nombre de couches d'appels il y a à l'intérieur de getStackTrace avant de vous frappez le point où la trace est généré. Une solution plus robuste serait d'obtenir la trace, et de parcourir à la recherche de l'image pour getCallingMethodName, puis prendre deux étapes jusqu'à trouver le vrai de l'appelant.
Vous pouvez obtenir une trace de la pile comme ceci:
Si vous souhaitez accéder à l'image, vous pouvez utiliser t.getStackTrace() pour obtenir un tableau de la pile d'images.
Être conscient que cette stacktrace (comme tous les autres) peuvent manquer de certains cadres si le hotspot compilateur a été occupé à l'optimisation des choses.
t.printStackTrace
avect.printStackTrace(System.out)
.new Throwable().printStackTrace(System.out);
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Avis de ce Thread.dumpStack() en fait déclenche une exception:
Vous pouvez également envoyer un signal à la JVM pour exécuter le Fil.getAllStackTraces() sur l'exécution d'un processus Java par l'envoi d'un signal de fin de processus.
Sur Unix/Linux utilisation:
kill -QUIT process_id
, où process_id est le numéro de processus de votre programme Java.Sur Windows, vous pouvez appuyer sur Ctrl-Pause dans l'application, même si vous n'êtes généralement pas voir cela, sauf si vous êtes en cours d'exécution d'un processus de console.
JDK6 introduit une autre option, le jstack de commande, qui permet d'afficher la pile de tous les cours JDK6 processus 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 être modifiés facilement. Ils sont particulièrement utiles pour le diagnostic de l'exécution des blocages ou des problèmes de performances.
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/
http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
Si vous avez besoin de capturer la sortie
Java 9 introduit la
StackWalker
et les classes de support pour la marche de la pile.Voici quelques extraits de la Javadoc:
HPROF Java Profiler
Vous n'avez même pas à le faire dans le code. Vous pouvez joindre le Java HPROF à vos processus et à tout moment, appuyez sur Control-\ pour la sortie des tas de vidage, de threads en cours d'exécution, etc . . . sans curage de votre code d'application. C'est un peu dépassé, Java 6 est livré avec l'interface graphique jconsole, mais je trouve toujours HPROF être très utile.