¿Hay alguna manera de volcar un seguimiento de la pila sin generar una excepción en Java?

Resuelto corgrath asked hace 15 años • 10 respuestas

Estoy pensando en crear una herramienta de depuración para mi aplicación Java.

Me pregunto si es posible obtener un seguimiento de la pila, igual Exception.printStackTrace()pero sin generar una excepción.

Mi objetivo es, en cualquier método determinado, volcar una pila para ver quién es la persona que llama al método.

corgrath avatar Jun 03 '09 21:06 corgrath
Aceptado

Sí, simplemente usa

Thread.dumpStack()
Rob Di Marco avatar Jun 03 '2009 14:06 Rob Di Marco

También puedes intentar Thread.getAllStackTraces()obtener un mapa de seguimientos de pila para todos los subprocesos que están activos.

Prabhu R avatar Jun 03 '2009 14:06 Prabhu R

Si desea el seguimiento solo para el hilo actual (en lugar de todos los hilos del sistema, como lo hace la sugerencia de Ram), haga:

Hilo.currentThread(). obtenerStackTrace()

Para encontrar a la persona que llama, haga:

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

Y llame a ese método desde dentro del método que necesita saber quién es la persona que llama. Sin embargo, una advertencia: ¡el índice del marco de llamada dentro de la lista podría variar según la JVM! Todo depende de cuántas capas de llamadas hay dentro de getStackTrace antes de llegar al punto donde se genera el seguimiento. Una solución más sólida sería obtener el seguimiento e iterarlo buscando el marco para getCallingMethodName, luego dar dos pasos más para encontrar la verdadera persona que llama.

Tom Anderson avatar Jun 03 '2009 15:06 Tom Anderson

Puede obtener un seguimiento de la pila como este:

Throwable t = new Throwable();
t.printStackTrace();

Si desea acceder al marco, puede utilizar t.getStackTrace()para obtener una serie de marcos de pila.

Tenga en cuenta que a este seguimiento de pila (como a cualquier otro) le pueden faltar algunos fotogramas si el compilador del punto de acceso ha estado ocupado optimizando cosas.

Gerco Dries avatar Jun 03 '2009 14:06 Gerco Dries