2009-06-22 28 views
16

¿Hay alguna forma de generar un seguimiento de llamadas para un hilo en particular en java?Seguimiento de llamadas en java

No quiero un seguimiento de la pila. Me gustaría una secuencia de llamadas en cada objeto para el seguimiento.

Respuesta

10

Hay btrace, que se puede utilizar para este tipo de acción.

2

Runtime.traceMethodCalls(), que imprime una línea para cada llamada al método de todos los objetos en todas las discusiones

+0

de Sun del punto de acceso en las ventanas no parece salida de las llamadas de método de rastreo. He leído que necesito ejecutar java debug con 'java_g'. ¿Algunas ideas? – JavaRocky

+0

Sí, para mí 'Runtime.getRuntime(). TraceMethodCalls (true);' no hace nada también. ¿Debo pasar argumentos a 'javac' o' java'? –

+0

Todavía no tiene la versión de java "1.8.0_111" –

2

Es, básicamente, querría programación orientada a aspectos de alguna forma, donde el aspecto podría determinar si el subproceso actual estaba destinado a ser llamadas de registro. (La alternativa es poner explícitamente el registro en cada método, lo cual sería doloroso).

Existen muchos marcos AOP en Java, como AspectJ y Spring (Spring es mucho más que AOP, por supuesto).

Aplicar aspectos a cada llamada de método en el sistema podría ser complicado sin embargo ... No tengo ninguna experiencia con AspectJ, pero Spring AOP está básicamente diseñado para permitir AOP alrededor de los componentes. Las clases que son efectivamente desconocidas para Spring no se pueden cambiar fácilmente. Eso sí, ha pasado un tiempo desde que utilicé Spring AOP - las cosas pueden haber empezado desde entonces :)

2

Podríamos crear un nuevo objeto Throwable que tendrá el rastro de llamada. Y usando algunas manipulaciones de cadena, podemos obtener la pila de llamadas.

Throwable t = new Throwable(); 
System.out.println(t.getStackTrace()[1].toString()); 

No estoy seguro de recuperar la información de esta manera, es una buena práctica o no. :)

+1

Dolorosamente lento, por lo que se utiliza para el rastreo local durante la depuración. – glmxndr

13

Creo que puede encontrar esto interesante. Es un agente de Java que agrega el registro de entrada y salida a los métodos, utilizando el marco slf4j para realmente registrar el resultado. Entonces es una cuestión de configurar el marco de registro para imprimir sólo por ese hilo que está interesado en

http://www.slf4j.org/extensions.html#javaagent

(sólo para ser explícita: 1). Lo escribí, 2) que funciona para mí :))

+1

WOW. Mente = ¡Soplado! – JavaRocky

+0

absolutamente maravilloso! lo probé y funcionó muy bien :) ¡gracias por esta extensión tan útil! – stratwine

+0

¿cómo puedo usar esto en proyectos de Android? – RegisteredUser

3

Si desea rastrear la ejecución de su código Java puede usar una herramienta llamada InTrace.

NOTA: InTrace es una herramienta gratuita y de código abierto que he escrito.

1

La manera más fácil de lo Btrace está utilizando HouseMD, se puede obtener la de vm here

Cuestiones relacionadas