查找Java程序的实际运行时调用树

时间:2010-04-06 05:46:42

标签: java eclipse debugging methods hierarchy

假设我有一个包含数百种方法的大程序。并且根据输入的性质,程序流程正在发生变化。

想想我想改变原始流程。找到调用层次结构/引用并理解流程是一件很麻烦的事。

我是否在Eclipse中有任何解决方案?还是一个插件?作为一个例子,我只需要一个按时间顺序记录的方法名称。然后我不需要担心与我的“给定输入”

无关的方法

更新:在eclipse中使用调试模式或添加打印消息是不可行的。该计划太棒了。 :)

2 个答案:

答案 0 :(得分:5)

您可以使用 AspectJ 记录所有名为的方法的名称,而无需更改原始程序。

例如,请参阅 tracing

aspect SimpleTracing {
    pointcut tracedCall():
        call(void FigureElement.draw(GraphicsContext));

    before(): tracedCall() {
        System.out.println("Entering: " + thisJoinPoint);
    }
}

答案 1 :(得分:1)

如果你只想知道调用哪些方法,而不是精确的顺序,你可以考虑使用测试覆盖率工具。这些工具用于检测源代码,以不同的粒度收集“已执行”事实(仅限方法调用,和/或由条件控制的每个代码块)。

SD Test Coverage Tool是一个可以执行此操作的工具。

它不会收集呼叫图甚至是呼叫的顺序。

如果您想要更多地控制仪器,可以考虑使用DMS Software Reengineering Toolkit。 DMS将以自定义源到源program transformation重写规则控制的任意方式解析,转换和重新打印Java。将日志记录转换插入到每个方法的开始和退出中会很容易(事实上,这几乎就是SD测试覆盖工具的工作原理)。给定原始的enter-X和exit-X数据,构造运行时调用树是一项简单的任务。