2014-02-06 60 views
0

编译后的.class文件包含对应于整个Java类的字节码。然而,在执行过程中,一些字节码会执行多次,而有些字节码可能根本不会执行,具体取决于逻辑和输入。有没有一种方法可以在java程序的生命周期中获得仅执行执行的字节码?如何获得Java程序运行时执行的字节码?

编辑:用例

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

+2

你有没有试过探查器? –

+1

您可以查看EMMA代码覆盖率工具(或其他类似的仪器库)。它可以与IDE集成,并在源代码级展示给你,哪些代码行被执行,哪些不是。 – slipperyseal

+0

同意以上两点。提取完整的跟踪信息 - 如果你能找到一个能为你做的仪器化的JVM--将会非常缓慢地运行并产生一个巨大的日志文件,这对于分析来说非常慢。代码覆盖工具可以显示程序的哪些部分正在执行的频率更快。统计分析器,尤其是那些可以专注于特定运行时间段的分析器,理论上不太精确,但由于它们中断了执行时间,所以它们实际上可能更精确,特别是在多线程代码中。 – keshlam

回答

1

这样一个工具,这个不起眼的纸会谈

http://ccsl.icmc.usp.br/files/vincenzi-et-al-2003.pdf

这是相当旧的(2003)

它指出

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