stack-trace - una - pilas java que es




Obtener el seguimiento actual de la pila en Java (15)

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

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

¿Cómo obtengo el seguimiento de pila actual en Java, como en .NET puedes hacer Environment.StackTrace ?

Por cierto, Thread.dumpStack() no es lo que quiero, quiero recuperar el seguimiento de la pila , no imprimirlo.


En Java 9 hay una nueva forma:

public static void showTrace() {

  List<StackFrame> frames =
    StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
               .walk( stream  -> stream.collect( Collectors.toList() ) );

  for ( StackFrame stackFrame : frames )
    System.out.println( stackFrame );
}

Otra solución (solo 35 31 caracteres):

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

Para ensartar con guayaba:

Throwables.getStackTraceAsString(new Throwable())

Puede usar Thread .currentThread().getStackTrace() .

Eso devuelve una matriz de StackTraceElement s que representan el seguimiento de pila actual de un programa.


Puede usar la utilidad jstack si desea verificar la pila de llamadas actual de su proceso.

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [[email protected]]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> 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

Sugiero que

  Thread.dumpStack()

es una forma más fácil y tiene la ventaja de no construir realmente una excepción o un objeto ejecutable cuando puede que no haya ningún problema, y ​​es considerablemente más importante.


Tal vez podrías probar esto:

catch(Exception e)
{
    StringWriter writer = new StringWriter();
    PrintWriter pw = new PrintWriter(writer);
    e.printStackTrace(pw);
    String errorDetail = writer.toString();
}

La cadena 'errorDetail' contiene el stacktrace.


Tonto, es Thread.currentThread().getStackTrace();


Tony, como un comentario a la respuesta aceptada, ha dado la que parece ser la mejor respuesta que responde realmente a la pregunta del OP :

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

... el OP NO preguntó cómo obtener una String de la traza de pila de una Exception . Y aunque soy un gran fan de Apache Commons, cuando hay algo tan simple como lo anterior no hay razón lógica para usar una biblioteca externa.


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

Esto le ayudará a imprimir el seguimiento de la pila sin bucle.


Obteniendo stacktrace:

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

Estampado de pila (JAVA 9+):

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

Impresión stacktrage (JAVA 7):

StringBuilder sb = new StringBuilder();

for (StackTraceElement st : ste) {
    sb.append(st.toString() + System.lineSeparator());
}
System.out.println(sb);

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


Thread.currentThread().getStackTrace();

está disponible desde JDK1.5.

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

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

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

o

Thread.currentThread().getStackTrace()