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

问题描述:

假设我有一个包含数百种方法的大程序。根据输入的性质,程序流程正在发生变化。查找Java程序的实际运行时调用树

想想我想改变原始流程。查找调用层次结构/引用并理解流程非常麻烦。

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

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

+0

您是否想要在运行时发生的实际调用树?您的问题意味着您只想知道给定输入的相关代码,而不是确切的调用树。 – 2010-04-06 05:50:02

+0

@ Ira Baxter:是的,实际的呼叫树。感谢澄清问题:) – 2010-04-06 05:52:14

你可以使用AspectJ记录的全称为方法的名称,而不改变你原来的计划。

查看tracing例如。

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

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

如果你想知道的是什么方法接到电话,而不是精确的顺序,你可以考虑使用一个测试覆盖工具。这些工具对源代码进行测试,以不同程度的粒度(仅方法调用,和/或由条件控制的每个代码块)收集“这个得到执行”的事实。

SD Test Coverage Tool是一个可以做到这一点的工具。

它不会收集通话图表甚至通话的顺序。

如果您想更好地控制仪器,可以考虑使用DMS Software Reengineering Toolkit。 DMS将以任意方式解析,转换和相应打印Java,这些任意方式由自定义源到源program transformation重写规则来控制。将日志转换插入每个方法的开始和结束都很容易(事实上,这几乎就是SD测试覆盖工具的工作原理)。鉴于原始的enter-X和exit-X数据,构建运行时调用树是一项直接的任务。