¿Hay alguna manera de volcar un seguimiento de la pila sin generar una excepción en Java?
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.
Sí, simplemente usa
Thread.dumpStack()
También puedes intentar Thread.getAllStackTraces()
obtener un mapa de seguimientos de pila para todos los subprocesos que están activos.
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.
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.