快速业务通道

Java理论与实践:平衡测试,第1部分:不要仅编写测试,还要编写bug检测器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
bug 检测器的第一步是识别被检测的 bug 模式。在本例中,该模式非 常简单,只需调用 System.gc() 即可。要编写识别字节码中此模式的检测器, 则需要知道对应于 bug 模式的字节码是什么。了解此问题的最好方法是编写一 个包含 bug 的小程序,对它进行编译,并使用 javap -c 解开 .class 文件。 清单 2 显示了一个展示该 bug 的类:

清单 2. 展示 bug 模式(我们想为它构建一个检测器)的代码

public class BadClass {    public void doBadStuff() {      System.gc();    } } 

清单 3 显示了运行示例类时 javap -c 的输出:

清单 3. 清单 2 中代码的字节码清单

public void doBadStuff ();   Code:    0: invokestatic #2; //Method java/lang/System.gc:()V     3: return

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 检测器

public class  CallSystemGC extends BytecodeScanningDetector {    private BugReporter bugReporter;    public CallSystemGC(BugReporter bugReporter) {      this.bugReporter = bugReporter;    }    public void sawOpcode(int seen) {      if (seen == INVOKESTATIC) {        if (getClassConstantOperand().equals ("java/lang/System")            && getNameConstantOperand().equals("gc")) {          bugReporter.reportBug(new BugInstance("SYSTEM_GC",  NORMAL_PRIORITY)              .addClassAndMethod(this)              .addSourceLine(this));        }      }    } }

将检测器包装为插件

创建新的 bug 检测所需的最后一步是将其打包为一个插件。FindBugs 插件 包含一个或多个 bug 检测器、一个部署描述符和一个资源文件,它们被打包成 一个 JAR 文件,放在 FindBugs 安装的插件目录中。称为 findbugs.xml 的部 署描述符将定义已知的 bug 检测器和它报告的错误。称为 messages.xml (对 于本地化版本称为 messages_xx.xml)的资源文件定义特定于语言的、将由 FindBugs GUI 使用的字符串,用它描述所报告的 bug。清单 5 和清单 6 显示 了示例 bug 检测器的部署描述符和资源文件。插件 JAR 中可以包括多个资源文 件的本地版本;部署描述符和资源文件放置在插件 JAR 的顶级目录中。

清单 5. 示例 bug 检测器的部署描述符

<FindbugsPlugin  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:noNamespaceSchemaLocation="findbugsplugin.xsd"    pluginid="com.briangoetz.findbugs.plugin"          defaultenabled="true"          provider="Brian Goetz"          website="http://www.briangoetz.com">   <Detector class="com.briangoetz.findbugs.plugin.CallSyste

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号