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

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

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

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

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

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

例如,请参见跟踪

aspect SimpleTracing { pointcut tracedCall(): call(void FigureElement.draw(GraphicsContext)); before(): tracedCall() { System.out.println("Entering: " + thisJoinPoint); } } 

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

SD测试覆盖率工具是一个可以执行此操作的工具。

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

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