【问题标题】:Finding the actual runtime call tree of a Java Program查找 Java 程序的实际运行时调用树
【发布时间】:2011-02-04 16:32:27
【问题描述】:

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

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

我在 Eclipse 中有什么解决方案吗?还是插件?例如,我只需要按时间顺序排列的方法名称日志。那我就不用担心那些与我的“给定输入”无关的方法了

更新:在 Eclipse 中使用调试模式或添加打印消息是不可行的。节目太大了。 :)

【问题讨论】:

  • 您想要运行时发生的实际调用树吗?您的问题意味着您只想知道与给定输入相关的代码,而不是确切的调用树。
  • @Ira Baxter:是的,实际的调用树。感谢您澄清问题:)

标签: java eclipse debugging methods hierarchy


【解决方案1】:

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

例如,参见 tracing

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

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

【讨论】:

    【解决方案2】:

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

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

    它不会收集调用图甚至调用顺序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2020-10-12
      相关资源
      最近更新 更多