0

您好,
我在 Hudson 建立了一个简单的测试项目,该项目的构建过程(一个批处理文件)会生成一个 findbugs.xml 文件。这是由 Hudson 的 FindBugs 插件处理的,但它将错误的行号显示为“-1”而不是它们的实际行号。一位同事建议我为编译器启用调试信息。我为 javac 使用了 -g“生成所有调试信息”选项,但似乎没有任何改变。我的构建命令是:

javac -g -classpath C:\testWebApp1\src -d C:\testWebApp1\build C:\testWebApp1\src\*.java

build.bat 文件中唯一的另一件事是调用 FindBug 工具(文本 UI)。以下是 FindBugs 插件对第一个错误的说明:

File: GenerateHellos.java, Line: -1, Type: UUF_UNUSED_FIELD, Priority: Normal, Category: PERFORMANCE

有任何想法吗?万分感谢!

4

2 回答 2

1

这是答案的一半:

您在该类中声明了一个未使用的字段。FindBugs 使用字节码的静态分析来查找错误;不幸的是,字节码格式不存储类或成员字段的行号,因此 FindBugs 无法实际报告行号。必须有一些开关可以让它输出更多有用的信息(即字段的名称),但我不知道。

或者,您可以尝试PMD,它更嘈杂,但实际上分析了源代码并与 Hudson 集成


做了更多的挖掘,看起来这可能是该错误模式的检查器中的一个错误。假设您的 FindBugs 运行配置了适当的源目录(即,使用-sourcepath),发现的大多数错误应该具有与其相关联的行号。要检查这一点,请打开输出的报告。您应该看到如下元素:

<!-- skipping a bit -->
<BugInstance type="...">
    <Class classname="com.example.MyClass">
        <!-- ... -->
    </Class>
    <!-- ... -->
    <SourceLine classname="com.example.MyClass" start="5" end="5" sourcefile="MyClass.java"/>
</BugInstance>

那里的关键是<SourceLine classname="..."/>,它报告发现错误的行号。对于许多其他检查,包括未读字段的检查以及字节码中没有行号的其他几种情况,此行已正确填写,但UUF_UNUSED_FIELD. 因此,Hudson 插件正在做明智的事情并报告line = -1

然而,Eclipse 插件可以访问 Eclipse 关于源代码的丰富元数据,它能够通过匹配字段名称来定位该字段,因此,它似乎在 Eclipse 中工作(如果您在 Eclipse 中删除有问题的字段,您应该会看到错误出现在文件的第一行;其他错误出现在 XML 报告中指定的行号上)。

没有修复,但希望能澄清正在发生的事情。

于 2010-04-14T18:06:08.413 回答
0

使用-g 就差不多了。Findbugs 基于字节码分析,并且依赖于类文件中的调试信息,你的同事是对的。

您还需要清除任何以前生成的类文件,因为编译器是基于时间戳的,并且不会重新生成显示为最新的文件。

于 2010-04-14T20:39:18.823 回答