¿Cómo obtengo el seguimiento de la pila actual en Java, como en .NET que puede hacer?Environment.StackTrace
?
Encontré, Thread.dumpStack()
pero no es lo que quiero, quiero recuperar el seguimiento de la pila, no imprimirlo.
stack-trace
java
ripper234
fuente
fuente
Respuestas:
Puedes usar
Thread.currentThread().getStackTrace()
.Eso devuelve una matriz de
StackTraceElement
s que representa la traza de pila actual de un programa.fuente
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
stackoverflow.com/a/10620951/11236new Throwable().getStackTrace()
es mucho más rápido, porque no necesita verificarthis != Thread.currentThread()
y omite los posibles gastos generales de JVM de llamarlo a través de child-class (Exception extends Throwable
)está bien si no te importa cuál es el primer elemento de la pila.
tendrá una posición definida para su método actual, si eso es importante.
fuente
(new Throwable()).getStackTrace()
también se ejecuta más rápido (vea bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 )(new Exception()).getStackTrace()
cuando el seguimiento de la pila solicitada está en el hilo actual (que siempre será el caso paraThread.currentThread().getStackTrace();
fuente
new Exception().printStackTrace(System.out)
lo que puedo recordar, el bucle for probablemente tenga menos sobrecarga, pero de todos modos solo debe usar esto como una depuración ...for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
está disponible desde JDK1.5.
Para una versión anterior, puede redirigir
exception.printStackTrace()
aStringWriter()
:fuente
new Throwable().getStackTrace()
está disponible desde JDK1.4 ...Puede usar los comunes de Apache para eso:
fuente
org.apache.commons.lang3
, la línea completa es:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, lo que inicialmente pasé por alto: la importación usa enlang3
lugar delang
y reemplazagetFullStackTrace
congetStackTrace
.ExceptionUtils.getStackTrace(new Throwable())
expresión para obtener el seguimiento de la pila.En Android, una forma mucho más fácil es usar esto:
fuente
Para obtener el seguimiento de la pila de todos los hilos, puede usar la utilidad jstack, JConsole o enviar una señal kill -quit (en un sistema operativo Posix).
Sin embargo, si desea hacer esto mediante programación, puede intentar usar ThreadMXBean:
Como se mencionó, si solo desea el seguimiento de la pila del hilo actual, es mucho más fácil: solo use
Thread.currentThread().getStackTrace()
;fuente
System.err.println(elems[i])
en cada uno). Faltabean.
la segunda línea del fragmento antes del,dumpAllThreads
pero supongo que la mayoría de la gente podría resolverlo.Otra solución (solo
3531 caracteres):fuente
Tonto yo, es
Thread.currentThread().getStackTrace();
fuente
Tony, como comentario a la respuesta aceptada, ha dado lo que parece ser la mejor respuesta que realmente responde a la pregunta del OP :
... el OP NO preguntó cómo obtener un
String
seguimiento de la pila de unException
. Y aunque soy un gran fanático de Apache Commons, cuando hay algo tan simple como lo anterior, no hay una razón lógica para usar una biblioteca externa.fuente
Thread.getAllStackTraces()
que le da aMap<Thread, StackTraceElement[]>
. Hotspot salvaguardará todos los subprocesos siempre que sea necesario. Zing puede llevar hilos individuales a un punto seguro sin molestar al otro. Obtener un stacktrace requiere un punto seguro.Thread.getAllStackTraces()
obtiene todos los rastros de la pila y detiene todos los hilos solo una vez. Por supuesto, debes averiguar en qué mapeo estás realmente interesado.Sugiero que
es una manera más fácil y tiene la ventaja de no construir realmente una excepción o lanzarla cuando puede que no haya ningún problema, y es considerablemente más importante.
fuente
new Exception("Stack trace").printStackTrace();
así que en realidad está construyendo un ThrowableObteniendo stacktrace:
Impresión de stacktrace (JAVA 8+):
Impresión de stacktrage (JAVA 7):
fuente
En Java 9 hay una nueva forma:
fuente
Tengo un método de utilidad que devuelve una cadena con el stacktrace:
Y solo logit como ...
fuente
java.util.logging.Logger#log(Level, String, Throwable)
Ya hace esto. Esto está reescribiendo cosas que ya existen en la biblioteca estándar de Java innecesariamente y está apuntando a los nuevos desarrolladores en la dirección incorrecta, que está lejos de la documentación. Al hacer esto ahora, ha obligado a Stacktrace a formatearse de cierta manera, ya que lalogging
API le permite variar el formato de la instrucción de registro dinámicamente a medida que la especifica. Que yo sepa,log4j
también tiene un comportamiento similar también. No reinventes la rueda porque terminas perdiendo cosas como te he explicado.Throwable
fuera a losHandler
s a través de lasFormatter
s en 2012 que era Java7, más de lo que he enumerado aquí Y estas funciones se remontan mucho más tiempo que Java7 ha existido;. por lo tanto, J2SE 5.0 javadocs)Para ensartar con guayaba:
fuente
o
fuente
Quizás podrías intentar esto:
La cadena 'errorDetail' contiene el stacktrace.
fuente
recorra StackTraceElement y obtenga el resultado deseado.
fuente
Usé respuestas de arriba y agregué formato
fuente
Puede usar la utilidad jstack si desea verificar la pila de llamadas actual de su proceso.
fuente
Esta es una publicación antigua, pero aquí está mi solución:
Más información y más métodos allí: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
fuente
Thread.dumpStack()
directamente porque es un método estático.System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
Esto lo ayudará a imprimir el seguimiento de la pila sin bucle.
fuente