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, ¿ Exception.printStackTrace()
pero sin lanzar una excepción?
Mi objetivo es, en cualquier método, volcar una pila para ver quién llama el método.
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
stderr
, lo que parece ser la implicación de la pregunta.Si desea rastrear solo el hilo actual (en lugar de todos los hilos en el sistema, como lo sugiere la sugerencia de Ram), haga lo siguiente:
Thread.currentThread (). getStackTrace ()
Para encontrar a la persona que llama, haz:
Y llame a ese método desde dentro del método que necesita saber quién llama. Sin embargo, una advertencia: ¡el índice del marco de llamada dentro de la lista puede variar de acuerdo con 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 robusta sería obtener el rastreo e iterar sobre él buscando el marco para getCallingMethodName, luego dar dos pasos más arriba para encontrar el verdadero llamador.
fuente
Puede obtener un seguimiento de pila como este:
Si desea acceder al marco, puede usar t.getStackTrace () para obtener una matriz de marcos de pila.
Tenga en cuenta que a este stacktrace (como a cualquier otro) le pueden faltar algunos fotogramas si el compilador de punto de acceso ha estado ocupado optimizando las cosas.
fuente
t.printStackTrace
cont.printStackTrace(System.out)
.new Throwable().printStackTrace(System.out);
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Tenga en cuenta que Thread.dumpStack () en realidad arroja una excepción:
fuente
También puede enviar una señal a la JVM para ejecutar Thread.getAllStackTraces () en un proceso Java en ejecución enviando una señal QUIT al proceso.
En uso de Unix / Linux:
kill -QUIT process_id
, donde process_id es el número de proceso de su programa Java.En Windows, puede presionar Ctrl-Break en la aplicación, aunque generalmente no verá esto a menos que esté ejecutando un proceso de consola.
JDK6 introdujo otra opción, el comando jstack, que mostrará la pila de cualquier proceso JDK6 en ejecución en su computadora:
jstack [-l] <pid>
Estas opciones son muy útiles para aplicaciones que se ejecutan en un entorno de producción y no se pueden modificar fácilmente. Son especialmente útiles para diagnosticar puntos muertos de tiempo de ejecución o problemas de rendimiento.
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
fuente
Si necesita captura de salida
fuente
Java 9 introdujo las
StackWalker
clases de apoyo para caminar por la pila.Aquí hay algunos fragmentos del Javadoc:
fuente
HPROF Java Profiler
Ni siquiera tiene que hacer esto en el código. Puede adjuntar el HPROF de Java a su proceso y, en cualquier momento, presione Control- \ para generar el volcado del montón, ejecutar subprocesos, etc. . . sin estropear su código de aplicación. Esto está un poco desactualizado, Java 6 viene con la interfaz gráfica de usuario de GUI, pero todavía encuentro que HPROF es muy útil.
fuente
La respuesta de Rob Di Marco es, con mucho, la mejor si está contento de salir
stderr
.Si desea capturar a a
String
, con nuevas líneas según un trazado normal, puede hacer esto:fuente