tutorial que ejemplos descargar java debugging callstack

que - Cómo obtener Java Call Stack de una aplicación en ejecución



javafx tutorial (6)

Estoy trabajando en una gran aplicación basada en la web de Java. Dado que no se realiza un registro adecuado durante el desarrollo, es muy difícil para mí poner punto de corte y depurar la aplicación, ya que no conozco el orden de ejecución. ¿Hay algún mecanismo para completar la Pila de llamadas de la aplicación java en ejecución después de realizar algunas acciones?

Lo busqué en la red durante mucho tiempo, pero no pude llegar a una solución concreta. Por favor sugiérame si hay algo para eso. Gracias


Método 1: utilice la utilidad jstack desde la línea de comandos (parte de la distribución JDK).

Método 2: envíe la señal 3 al proceso java, va a volcar rastros de pila en stdout.

Método 3: llame a Thread.getAllStackTraces () desde la aplicación:

public class StackTraceDumper { public static dumpAllStackTraces () { for (Map.Entry <Thread, StackTraceElement []> entry: Thread.getAllStackTraces().entrySet ()) { System.out.println (entry.getKey ().getName () + ":"); for (StackTraceElement element: entry.getValue ()) System.out.println ("/t" + element); } } }

Luego use StackTraceDumper.dumpAllStackTraces() donde necesita volcar los rastros de pila.



Hay algunas opciones:

  • Ejecútelo en un depurador y pause todos los hilos, luego puede inspeccionarlos
  • Use VisualVM para conectarse a los procesos en ejecución y desencadenar un volcado de subprocesos. Viene con el JDK.
  • Use jstack en la línea de comando para volcar hilos.

Agregue un poco de registro básico a su código:

new RuntimeException().printStackTrace();

Eso enviará un rastro estático a stderr


Thread.dumpStack() Imprime un seguimiento de pila del hilo actual en el flujo de error estándar. Thread.getAllStackTraces() Devuelve un mapa de seguimientos de pila para todos los subprocesos en vivo. Thread.getStackTrace() Devuelve una matriz de elementos de traza de pila que representan el volcado de pila de este subproceso.


¿Por qué no utiliza alguna herramienta de AOP como AspectJ para capturar estos valores y registrar? Puede usar el corte de punto de ejecución () junto con el consejo after (). Para la implementación sin producción, puede registrar todas las llamadas al método junto con los valores pasados ​​y el valor devuelto. Esto será demasiada sobrecarga para env de producción. Para eso puedes simplemente almacenar los valores pasados ​​(Object args [] como obtienes en el consejo de AspectJ) en la variable local y solo registrarlo en caso de excepción. Pero incluso en ese caso, habrá una cierta penalización de rendimiento ya que los valores primitivos se incluirán en cuadros para pasarlos como Objeto [] a su consejo.


Puede disparar un volcado de pila presionando Ctrl + Break , o enviando una señal 3 (en sistemas basados ​​en Unix). Tenga en cuenta que obtendrá un seguimiento de pila por subproceso . Esto irá a un error estándar , así que asegúrese de que su registro esté capturando esto.

Puedes hacer esto programáticamente a través de

Map<Thread, StackTraceElement[]> m = Thread.getAllStackTraces();

Aquí hay más información sobre cómo obtener y analizar rastros de pila.

Como habrás notado, BTrace es otra posibilidad. Aquí hay una respuesta SO sobre su uso.