Récupère la trace actuelle de la stack en Java

Comment puis-je obtenir la trace de la stack actuelle en Java, comme comment, dans .NET, vous pouvez faire Environment.StackTrace ?

BTW, Thread.dumpStack() n’est pas ce que je veux – je veux récupérer la trace de la stack , pas l’imprimer.

Vous pouvez utiliser Thread .currentThread().getStackTrace() .

Cela renvoie un tableau de StackTraceElement s représentant la trace de stack actuelle d’un programme.

 Thread.currentThread().getStackTrace(); 

c’est bien si vous ne vous souciez pas du premier élément de la stack.

 new Throwable().getStackTrace(); 

aura une position définie pour votre méthode actuelle, si cela compte.

 for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { System.out.println(ste); } 
 Thread.currentThread().getStackTrace(); 

est disponible depuis JDK1.5.

Pour une version antérieure, vous pouvez redirect exception.printStackTrace() vers SsortingngWriter() :

 SsortingngWriter sw = new SsortingngWriter(); new Throwable("").printStackTrace(new PrintWriter(sw)); Ssortingng stackTrace = sw.toSsortingng(); 

Vous pouvez utiliser les communs d’Apache pour cela:

 Ssortingng fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e); 

Sur Android, le moyen le plus simple est d’utiliser ceci:

 import android.util.Log; Ssortingng stackTrace = Log.getStackTraceSsortingng(exception); 

Pour obtenir la trace de la stack de tous les threads, vous pouvez utiliser l’utilitaire jstack, JConsole ou envoyer un signal kill -quit (sur un système d’exploitation Posix).

Toutefois, si vous souhaitez le faire par programmation, vous pouvez essayer d’utiliser ThreadMXBean:

 ThreadMXBean bean = ManagementFactory.getThreadMXBean(); ThreadInfo[] infos = bean.dumpAllThreads(true, true); for (ThreadInfo info : infos) { StackTraceElement[] elems = info.getStackTrace(); // Print out elements, etc. } 

Comme mentionné, si vous ne voulez que la trace de la stack du thread actuel, c’est beaucoup plus facile – Utilisez simplement Thread.currentThread().getStackTrace() ;

Une autre solution (seulement 35 31 caractères):

 new Exception().printStackTrace(); new Error().printStackTrace(); 

Silly moi, c’est Thread.currentThread().getStackTrace();

Corder avec de la goyave:

 Throwables.getStackTraceAsSsortingng(new Throwable()) 

Tony, en guise de commentaire sur la réponse acceptée, a donné ce qui semble être la meilleure réponse à la question du PO :

 Arrays.toSsortingng(Thread.currentThread().getStackTrace()); 

… l’OP n’a pas demandé comment obtenir une Ssortingng de la trace de la stack à partir d’une Exception . Et bien que je sois un grand fan d’Apache Commons, quand il y a quelque chose d’aussi simple que ce qui précède, il n’y a aucune raison logique d’utiliser une bibliothèque externe.

J’ai une méthode utilitaire qui retourne une chaîne avec le stacktrace:

 static Ssortingng getStackTrace(Throwable t) { SsortingngWriter sw = new SsortingngWriter(); PrintWriter pw = new PrintWriter(sw, true); t.printStackTrace(pw); pw.flush(); sw.flush(); return sw.toSsortingng(); } 

Et juste comme Logit …

 ... catch (FileNotFoundException e) { logger.config(getStackTrace(e)); } 

je suggère que

  Thread.dumpStack() 

est un moyen plus facile et a l’avantage de ne pas réellement construire d’exception ou de lancer quand il n’y a pas de problème du tout.

 try { } catch(Exception e) { StackTraceElement[] traceElements = e.getStackTrace(); //... } 

ou

 Thread.currentThread().getStackTrace() 

En Java 9, il existe une nouvelle méthode:

 public static void showTrace() { List frames = StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE ) .walk( stream -> stream.collect( Collectors.toList() ) ); for ( StackFrame stackFrame : frames ) System.out.println( stackFrame ); } 

Vous pourriez peut-être essayer ceci:

 catch(Exception e) { SsortingngWriter writer = new SsortingngWriter(); PrintWriter pw = new PrintWriter(writer); e.printStackTrace(pw); Ssortingng errorDetail = writer.toSsortingng(); } 

La chaîne ‘errorDetail’ contient le stacktrace.

 StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 

Le dernier élément du tableau représente le bas de la stack, qui est l’invocation la moins récente de la séquence.

 A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName(). 

parcourir StackTraceElement et obtenir le résultat souhaité.

 for (StackTraceElement ste : stackTraceElements ) { //do your stuff here... } 

Vous pouvez utiliser l’utilitaire jstack si vous souhaitez vérifier la stack d’appels actuelle de votre processus.

 Usage: jstack [-l]  (to connect to running process) jstack -F [-m] [-l]  (to connect to a hung process) jstack [-m] [-l]   (to connect to a core file) jstack [-m] [-l] [server_id@] (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack  does not respond (process is hung) -m to print both java and native frames (mixed mode) -l long listing. Prints additional information about locks -h or -help to print this help message 

J’ai utilisé les réponses ci-dessus et ajouté le formatage

 public final class DebugUtil { private static final Ssortingng SEPARATOR = "\n"; private DebugUtil() { } public static Ssortingng formatStackTrace(StackTraceElement[] stackTrace) { SsortingngBuilder buffer = new SsortingngBuilder(); for (StackTraceElement element : stackTrace) { buffer.append(element).append(SEPARATOR); } return buffer.toSsortingng(); } public static Ssortingng formatCurrentStacktrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); return formatStackTrace(stackTrace); } } 

Obtenir un stacktrace:

 StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 

Impression empilage (JAVA 9+):

 Arrays.asList(ste).stream().forEach(System.out::println); 

Impression stackage (JAVA 7):

 SsortingngBuilder sb = new SsortingngBuilder(); for (StackTraceElement st : ste) { sb.append(st.toSsortingng() + System.lineSeparator()); } System.out.println(sb); 

Ceci est un ancien message, mais voici ma solution:

 Thread.currentThread().dumpStack(); 

Plus d’infos et d’autres méthodes ici: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html

System.out.println(Arrays.toSsortingng(Thread.currentThread().getStackTrace()));

Cela vous aidera à imprimer la trace de stack sans boucle.