Question Obtenir la trace de pile actuelle en Java


Comment puis-je obtenir la trace de la pile en Java, comme dans .NET tu peux faire Environment.StackTrace?

BTW, Thread.dumpStack() n'est pas ce que je veux - je veux obtenir le trace de la pile retour, ne pas l'imprimer.


853
2017-07-01 13:13


origine


Réponses:


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

Cela renvoie un tableau de StackTraceElements qui représentent la trace de pile actuelle d'un programme.


1004
2017-07-01 13:15



Thread.currentThread().getStackTrace();

C'est bien si vous ne vous souciez pas du premier élément de la pile.

new Throwable().getStackTrace();

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


227
2017-07-01 13:29



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

160
2017-08-08 14:46



Thread.currentThread().getStackTrace();

est disponible depuis JDK1.5.

Pour une version plus ancienne, vous pouvez rediriger exception.printStackTrace() à un StringWriter() :

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();

54
2017-07-01 14:13



Vous pouvez utiliser les communs d'Apache pour cela:

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

34
2018-05-16 14:41



Sur Android, un moyen beaucoup plus facile est d'utiliser ceci:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 

21
2018-04-30 07:28



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).

Toutefois, si vous souhaitez effectuer cela par programme, 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 voulez seulement la trace de la pile du thread actuel, c'est beaucoup plus facile - Il suffit d'utiliser Thread.currentThread().getStackTrace();


18
2017-07-01 13:19