todas - ¿Hay alguna manera de volcar un seguimiento de pila sin lanzar una excepción en Java?
tipos de excepciones en java netbeans (9)
Java 9 introdujo StackWalker
y clases de apoyo para recorrer la pila.
Aquí hay algunos fragmentos del Javadoc:
El método
walk
abre una secuencia deStackFrames
secuencial para el hilo actual y luego aplica la función dada para recorrer el flujoStackFrame
. La secuencia informa los elementos del marco de la pila en orden, desde el marco superior que representa el punto de ejecución en el que se generó la pila hasta el marco inferior. La secuencia deStackFrame
se cierra cuando regresa el método de caminata. Si se intenta reutilizar la secuencia cerrada, seIllegalStateException
....
Para tomar una instantánea de los 10 primeros fotogramas de pila del subproceso actual,
List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).collect(Collectors.toList()));
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, al igual que Exception.printStackTrace()
pero sin lanzar una excepción.
Mi objetivo es, en cualquier método dado, volcar una pila para ver quién es el llamador del método.
Observe que Thread.dumpStack () arroja una excepción:
new Exception("Stack trace").printStackTrace();
Puedes obtener un seguimiento de pila como este:
Throwable t = new Throwable();
t.printStackTrace();
Si desea acceder al marco, puede usar t.getStackTrace () para obtener una matriz de marcos de pila.
Tenga en cuenta que esta stacktrace (al igual que cualquier otra) puede faltar algunos marcos si el compilador de puntos de acceso ha estado ocupado optimizando las cosas.
Sí, simplemente usa
Thread.dumpStack()
Si desea el seguimiento solo del hilo actual (en lugar de todos los hilos en el sistema, como lo hace la sugerencia de Ram), haga lo siguiente:
Thread.currentThread (). getStackTrace()
Para encontrar al que llama, hazlo:
private String getCallingMethodName() {
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
return callingFrame.getMethodName();
}
Y llame a ese método desde el método que necesita saber quién es su interlocutor. Sin embargo, una palabra de advertencia: ¡el índice del marco de llamada dentro de la lista podría 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 la traza. Una solución más robusta sería obtener la traza e iterar sobre ella buscando el marco para getCallingMethodName, luego dar dos pasos más hacia arriba para encontrar la verdadera persona que llama.
Si necesita salida de captura
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
También puede enviar una señal a la JVM para ejecutar Thread.getAllStackTraces () en un proceso en ejecución de Java 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 interbloqueos en 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
También puede probar Thread.getAllStackTraces()
para obtener un mapa de seguimientos de pila para todos los hilos que están vivos.
Ni siquiera tiene que hacer esto en el código. Puede adjuntar el HPROF de Java a su proceso y en cualquier momento presionar Control- / para generar el volcado del heap, ejecutar subprocesos, etc. . . sin ensuciar el código de tu aplicación. Esto está un poco desactualizado, Java 6 viene con la GUI jconsole, pero todavía encuentro que HPROF es muy útil.