Pregunta Obtener el seguimiento de la pila actual en Java


¿Cómo obtengo el seguimiento de la pila actual en Java, por ejemplo, cómo .RED tu puedes hacer Environment.StackTrace?

Por cierto, Thread.dumpStack() no es lo que quiero, quiero obtener el rastro de pila volver, no imprimirlo.


853
2017-07-01 13:13


origen


Respuestas:


Puedes usar Hilo.currentThread().getStackTrace().

Eso devuelve una variedad de StackTraceElements que representan la traza de la pila actual de un programa.


1004
2017-07-01 13:15



Thread.currentThread().getStackTrace();

está bien si no te importa cuál es el primer elemento de la pila.

new Throwable().getStackTrace();

tendrá una posición definida para su método actual, si eso es importante.


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 desde JDK1.5.

Para una versión anterior, puede redirigir exception.printStackTrace() a un StringWriter() :

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

54
2017-07-01 14:13



Puede usar los recursos comunes de Apache para eso:

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

34
2018-05-16 14:41



En Android una forma mucho más fácil es usar esto:

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

21
2018-04-30 07:28



Para obtener la traza de la pila de todos los hilos, puede utilizar la utilidad jstack, JConsole o enviar una señal kill -quit (en un sistema operativo Posix).

Sin embargo, si desea hacer esto programáticamente, puede intentar usar ThreadMXBean:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);

for (ThreadInfo info : infos) {
  StackTraceElement[] elems = info.getStackTrace();
  // Print out elements, etc.
}

Como se mencionó, si solo quiere el trazo de la pila del hilo actual, es mucho más fácil. Simplemente use Thread.currentThread().getStackTrace();


18
2017-07-01 13:19