2009-07-28 16 views
6

Tengo un problema real para rastrear un error y me ayudaría mucho saber qué método se llama cierto método. ¿Hay alguna manera fácil de obtener una jerarquía de llamadas de Java? Java es una pequeña parte de la aplicación, así que no puedo compilar y ejecutar toda la aplicación en eclipse/net beans, así que no tengo acceso a la jerarquía de llamadas del depurador IDE.Obteniendo una jerarquía de llamadas en java

+0

Parece que realmente quiere un seguimiento de pila, no una jerarquía de llamadas. (¿Es posible editar el Asunto de una pregunta?) –

+0

Un rastreo de pila es una jerarquía de llamadas a menos que me falte alguna diferencia sutil. –

+1

Una jerarquía de llamadas es un ÁRBOL de todos los lugares desde los que se puede invocar un procedimiento. –

Respuesta

14
Thread.currentThread().getStackTrace(); 

o

Exception ex = new Exception(); 
ex.printStackTrace(); 

Es bastante lento, pero está bien para fines de depuración. API docs here.

0

Lo mejor que se puede hacer es lanzar una excepción, atraparla de inmediato y analizar el seguimiento de la pila.

Creo que es así como Log4J puede iniciar sesión en el método de llamada.

+2

con Thread.dumpStack() o algo así, no es necesario lanzar una excepción artificial. – djna

+0

Tiene razón en que esta es la forma en que log4j lo hace. Creo que esto solo por razones históricas, ya que Java 1.5 está disponible el método currentThread(). GetStackTrace() sugerido por Nelson, por lo que este enfoque ya no es necesario. – mikej

1

Java es una pequeña parte de la aplicación, así que no puedo compilar y ejecutar toda la aplicación en eclipse/net beans, así que no tengo acceso a la jerarquía de llamadas del depurador IDE.

No necesita ejecutar la aplicación en absoluto. Si crea un proyecto en Eclipse, puede usar su herramienta incorporada Jerarquía de llamadas para buscar todos los lugares posibles que llaman a un método.

Existe un trade off: la herramienta Call Hierarchy le proporcionará TODOS los lugares desde los que se llama un método. Esto es bueno si quieres/necesitas saber todas las posibilidades. La sugerencia de Neslson de Thread.currentThread().getStackTrace() le dará los lugares desde donde se invoca un método durante el proceso de su programa para esta invocación. El matiz es que es posible que no se ejecute a través de cada ruta de código durante esta invocación. Si está viendo un comportamiento específico y desea saber cómo llegó allí, use la opción getStackTrace().

Cuestiones relacionadas