Java理论与实践:平衡测试,第1部分:不要仅编写测试,还要编写bug检测器 - 编程入门网
bug 检测器的第一步是识别被检测的 bug 模式。在本例中,该模式非 常简单,只需调用 System.gc() 即可。要编写识别字节码中此模式的检测器, 则需要知道对应于 bug 模式的字节码是什么。了解此问题的最好方法是编写一 个包含 bug 的小程序,对它进行编译,并使用 javap -c 解开 .class 文件。 清单 2 显示了一个展示该 bug 的类:
清单 2. 展示 bug 模式(我们想为它构建一个检测器)的代码
清单 3 显示了运行示例类时 javap -c 的输出: 清单 3. 清单 2 中代码的字节码清单
Java理论与实践:平衡测试,第1部分:不要仅编写测试,还要编写bug检测器(3)时间:2010-12-22 IBM Brian Goetz我们很快知道静态方法是通过 invokestatic JVM 指令调用的, invokestatic 的操作数是 java/lang/system 类的 gc:()V 方法。字节码中的 方法签名和类型名称与源代码中的略有不同,但它很容易用于字节码使用的编码 。 使用 bug 模式示例编写 FindBugs 检测器非常简单。清单 4 显示了扩展 BytecodeScanningDetector 基础类并重写 sawOpcode() 方法的检测器。当它遇 到 invokestatic 指令时,它会检查被调用方法的类和名称,如果是 System.gc() 指令,它会报告 bug 实例。 清单 4. 查找调用 System.gc() 的 Bug 检测器
将检测器包装为插件 创建新的 bug 检测所需的最后一步是将其打包为一个插件。FindBugs 插件 包含一个或多个 bug 检测器、一个部署描述符和一个资源文件,它们被打包成 一个 JAR 文件,放在 FindBugs 安装的插件目录中。称为 findbugs.xml 的部 署描述符将定义已知的 bug 检测器和它报告的错误。称为 messages.xml (对 于本地化版本称为 messages_xx.xml)的资源文件定义特定于语言的、将由 FindBugs GUI 使用的字符串,用它描述所报告的 bug。清单 5 和清单 6 显示 了示例 bug 检测器的部署描述符和资源文件。插件 JAR 中可以包括多个资源文 件的本地版本;部署描述符和资源文件放置在插件 JAR 的顶级目录中。 清单 5. 示例 bug 检测器的部署描述符
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |