在Java中获取调用层次结构

6

我正在努力追踪一个bug,知道哪个方法调用了某个方法会对我有很大帮助。是否有一种简单的方法从Java中获取调用层次结构?Java只是应用程序的一小部分,因此我无法在Eclipse / NetBeans中编译和运行整个应用程序,因此我无法访问IDE调试器的调用层次结构。


听起来你真正想要的是堆栈跟踪,而不是调用层次结构。(是否可以编辑问题的主题?) - Stephen C
堆栈跟踪是一个调用层次结构,除非我错过了一些微妙的差别。 - Bill K
1
调用层次结构是一个树形结构,它包含了一个过程可以被调用的所有位置。 - Stephen C
我必须同意Stephen C的观点,你所指的是堆栈跟踪。 - Steve Kuo
4个回答

15
Thread.currentThread().getStackTrace();
或者
Exception ex = new Exception();
ex.printStackTrace();

它相对比较慢,但对于调试目的来说还可以。 这里是API文档


1
Java只是应用程序的一小部分,因此我无法在Eclipse/NetBeans中编译和运行整个应用程序,因此无法访问IDE调试器的调用层次结构。
您根本不需要运行应用程序。如果您在Eclipse中创建一个项目,可以使用其内置的调用层次结构工具查找调用方法的所有可能位置。
这里有一个权衡:调用层次结构工具将为您提供调用方法的所有位置。如果您想/需要知道所有可能性,这是一个好选择。Neslson建议使用Thread.currentThread().getStackTrace(),它将为您提供在调用此调用过程中调用方法的位置。微妙之处在于,在此调用期间,您可能不会通过每个代码路径运行。如果您看到特定行为并想知道如何到达那里,请使用getStackTrace()选项。

0

0
最好的做法是抛出异常,立即捕获它并分析堆栈跟踪。
我相信这就是Log4J能够记录调用方法的方式。

2
使用Thread.dumpStack()或类似的方法,无需抛出人为异常。 - djna
你说得对,这就是log4j的做法。不过我认为这只是出于历史原因,因为自从Java 1.5以来,Nelson建议使用currentThread().getStackTrace()方法,所以这种方法已经不再必要了。 - mikej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接