Comment puis-je obtenir la trace de pile actuelle en Java, comme la façon dont .NET vous pouvez le faire Environment.StackTrace
?
J'ai trouvé Thread.dumpStack()
mais ce n'est pas ce que je veux - je veux récupérer la trace de la pile, pas l'imprimer.
stack-trace
java
ripper234
la source
la source
Réponses:
Vous pouvez utiliser
Thread.currentThread().getStackTrace()
.Cela renvoie un tableau de
StackTraceElement
s qui représentent la trace de pile actuelle d'un programme.la source
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
stackoverflow.com/a/10620951/11236new Throwable().getStackTrace()
est beaucoup plus rapide, car il n'a pas besoin de vérifierthis != Thread.currentThread()
et de contourner les frais généraux JVM potentiels de l'appel via la classe enfant (Exception extends Throwable
)est bien si vous ne vous souciez pas du premier élément de la pile.
aura une position définie pour votre méthode actuelle, si cela importe.
la source
(new Throwable()).getStackTrace()
s'exécute également plus rapidement (voir bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 )(new Exception()).getStackTrace()
lorsque la trace de pile demandée se trouve sur le thread actuel (ce qui sera toujours le cas pourThread.currentThread().getStackTrace();
la source
new Exception().printStackTrace(System.out)
ce dont je me souviens, la boucle for a probablement moins de surcharge, mais vous ne devriez de toute façon l'utiliser que comme débogage ...for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
est disponible depuis JDK1.5.
Pour une ancienne version, vous pouvez rediriger
exception.printStackTrace()
versStringWriter()
:la source
new Throwable().getStackTrace()
est disponible depuis JDK1.4…Vous pouvez utiliser les communs d'Apache pour cela:
la source
org.apache.commons.lang3
, la ligne complète est:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, ce que j'ai initialement ignoré - l'importation utilise à lalang3
place delang
et remplacegetFullStackTrace
pargetStackTrace
.ExceptionUtils.getStackTrace(new Throwable())
expression pour obtenir la trace de la pile.Sur Android, un moyen beaucoup plus simple consiste à utiliser ceci:
la source
Pour obtenir la trace de pile de tous les threads, vous pouvez utiliser l'utilitaire jstack, JConsole ou envoyer un signal kill -quit (sur un système d'exploitation Posix).
Cependant, si vous souhaitez le faire par programme, vous pouvez essayer d'utiliser ThreadMXBean:
Comme mentionné, si vous ne voulez que la trace de pile du thread actuel, c'est beaucoup plus facile - Utilisez simplement
Thread.currentThread().getStackTrace()
;la source
System.err.println(elems[i])
sur chacun). La deuxième ligne de l'extrait est manquantebean.
avant le,dumpAllThreads
mais je suppose que la plupart des gens pourraient résoudre ce problème.Autre solution (seulement
3531 caractères):la source
Bête moi c'est
Thread.currentThread().getStackTrace();
la source
Tony, en tant que commentaire de la réponse acceptée, a donné ce qui semble être la meilleure réponse qui répond en fait à la question du PO :
... l'OP n'a PAS demandé comment obtenir un
String
de la trace de pile d'unException
. Et même si je suis un grand fan d'Apache Commons, quand il y a quelque chose d'aussi simple que ci-dessus, il n'y a aucune raison logique d'utiliser une bibliothèque externe.la source
Thread.getAllStackTraces()
ce qui vous donne unMap<Thread, StackTraceElement[]>
. Le point d'accès sécurise tous les threads chaque fois qu'il en a besoin. Zing peut amener des threads individuels à un point de sauvegarde sans déranger l'autre. L'obtention d'une trace de pile nécessite un point de sécurité.Thread.getAllStackTraces()
obtient toutes les traces de pile et arrête tous les threads une seule fois. Bien sûr, vous devez savoir quelle cartographie vous intéresse réellement.je suggère que
est un moyen plus facile et présente l'avantage de ne pas réellement construire d'exception ou de lancer lorsqu'il n'y a peut-être pas de problème du tout, et est beaucoup plus pertinent.
la source
new Exception("Stack trace").printStackTrace();
il s'agit donc de construire un ThrowableObtenir stacktrace:
Impression de stacktrace (JAVA 8+):
Impression de stacktrage (JAVA 7):
la source
Dans Java 9, il existe une nouvelle façon:
la source
J'ai une méthode utilitaire qui renvoie une chaîne avec le stacktrace:
Et juste logit comme ...
la source
java.util.logging.Logger#log(Level, String, Throwable)
fait déjà cela. Cela réécrit inutilement des choses qui existent déjà dans la bibliothèque standard Java et pointe les nouveaux développeurs dans la mauvaise direction, ce qui est loin de la documentation. En procédant ainsi, vous avez forcé le formatage de Stacktrace d'une certaine manière, alors que l'logging
API vous permet de varier dynamiquement le formatage de l'instruction de journal lorsque vous le spécifiez. À ma connaissance, alog4j
également un comportement similaire. Ne réinventez pas la roue parce que vous finissez par perdre des choses comme je l'ai expliqué.Throwable
large auxHandler
s grâce auxFormatter
s en 2012 qui était java7, plus que je ne l' ai dans cette liste et ces fonctions remontent beaucoup plus longtemps que java7 a été autour;. d' où J2SE 5.0 javadocs)Pour enchaîner avec de la goyave:
la source
ou
la source
Vous pourriez peut-être essayer ceci:
La chaîne «errorDetail» contient la trace de pile.
la source
parcourez StackTraceElement et obtenez le résultat souhaité.
la source
J'ai utilisé les réponses ci-dessus et ajouté un formatage
la source
Vous pouvez utiliser l'utilitaire jstack si vous souhaitez vérifier la pile d'appels actuelle de votre processus.
la source
Ceci est un ancien poste, mais voici ma solution:
Plus d'informations et plus de méthodes là-bas: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
la source
Thread.dumpStack()
directement en raison de sa méthode statique.System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
Cela vous aidera à imprimer la trace de la pile sans boucle.
la source