如何获取Java程序在运行时执行的字节码?

如何获取Java程序在运行时执行的字节码?,java,debugging,bytecode,Java,Debugging,Bytecode,编译后的.class文件包含对应于整个java类的字节码。然而,在执行过程中,一些字节码被多次执行,而一些字节码可能根本不执行,这取决于逻辑和输入。有没有一种方法可以让我只跟踪java程序生命周期中执行的字节码 编辑:用例 我认为一个用例可能会有所帮助。在程序的示例运行之后,我想计算执行字节码指令的频率(例如,执行了10次ARETRUN)。是否有一个分析器或任何其他工具可以用于此目的?这篇晦涩难懂的文章讨论了这样一个工具 它相当古老(2003年) 它说 本文描述了一个用于Java程序和基于Ja

编译后的.class文件包含对应于整个java类的字节码。然而,在执行过程中,一些字节码被多次执行,而一些字节码可能根本不执行,这取决于逻辑和输入。有没有一种方法可以让我只跟踪java程序生命周期中执行的字节码

编辑:用例


我认为一个用例可能会有所帮助。在程序的示例运行之后,我想计算执行字节码指令的频率(例如,执行了10次ARETRUN)。是否有一个分析器或任何其他工具可以用于此目的?

这篇晦涩难懂的文章讨论了这样一个工具

它相当古老(2003年)

它说

本文描述了一个用于Java程序和基于Java的组件的覆盖率测试工具JaBUTi (Java字节码理解和测试)。不同于其他需要 执行程序分析、检测和覆盖率评估的Java源代码, 我们的工具只需要Java字节码。字节码可以看作是一种类似汇编的语言 保留有关程序的高级信息[Lindholm和Yellin,1999]。 因此,JaBUTi允许用户测试Java程序和基于Java的组件,即使没有 源代码可用。还有其他一些测试工具在字节码级别工作。 例如,框架JUnit[Beck and Gamma,2002]可以用来测试Java字节码,但是 它只允许执行黑盒测试;它不报告任何覆盖范围信息。 JTest[Corporation,2002]和GlassJAR[Edge,2002]提供了关于 在字节码级别控制流测试标准,但它们都不支持数据流覆盖 测试标准。通过在字节码级别工作,我们希望提供一个可以使用的工具 不仅用于测试具有相应源代码的Java应用程序,而且, 那些只有字节码的,比如软件组件


您试过分析器吗?您可以看看EMMA代码覆盖率工具(或其他类似的工具库)。它可以与IDE集成,并在源代码级别向您显示哪些代码行已执行,哪些代码行未执行。如果你能找到一个能为你做这件事的插装JVM,那么拉一个完整的跟踪会运行得非常慢,并产生一个巨大的日志文件,分析起来会非常慢。代码覆盖率工具显示程序的哪些部分正在执行,执行频率要快得多。统计分析器,特别是那些可以专注于特定运行时间段的分析器,理论上不太精确,但由于它们中断执行时间较少,因此实际上可能更精确,特别是在多线程代码中。从理论上讲,Java具有这一特性,允许您收集这些信息。加上许多IDE和其他开发工具在某种程度上支持这一点。在实践中,JVM通常编译为本机代码并执行它,因此询问它正在执行哪些字节码并不是真正有意义的。如果您不关心这一点或性能,那么您可以尝试使用插入指令的interperter。