4

我得到了新的cobertura (2.0.2..)的以下异常。我想这与在新块中立即创建新对象有关。

WARN   instrumentClass, Unable to instrument file c:\apps\ijprojects\TrickyInstrument\out\production\TrickyInstrument\InstrumentationFailsOnFirstNewClassInTryBlock.class
java.lang.RuntimeException: java.lang.ClassNotFoundException: DataAccess
        at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)
        at org.objectweb.asm.ClassWriter.a(Unknown Source)
        at org.objectweb.asm.Frame.a(Unknown Source)
        at org.objectweb.asm.Frame.a(Unknown Source)
        at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitMaxs(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter.visitMaxs(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitMaxs(Unknown Source)
        at org.objectweb.asm.commons.LocalVariablesSorter.visitMaxs(Unknown Source)
        at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitEnd(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(Unknown Source)
        at org.objectweb.asm.ClassReader.b(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.instrumentClass(CoberturaInstrumenter.java:204)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.instrumentClass(CoberturaInstrumenter.java:121)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.addInstrumentationToSingleClass(CoberturaInstrumenter.java:233)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentationToSingleClass(Main.java:274)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentation(Main.java:283)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentation(Main.java:292)
        at net.sourceforge.cobertura.instrument.Main.parseArguments(Main.java:373)
        at net.sourceforge.cobertura.instrument.Main.main(Main.java:395)
8 Jul, 2013 2:05:07 PM net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler saveCoverageData
INFO: Cobertura: Saved information on 2 classes.

以下是与上述异常相关的代码。

public class InstrumentationFailsOnFirstNewClassInTryBlock {


    public void saveToDatabase() {
        //
        try {
//            boolean b=false;
//            if ( b) {
//                System.out.println("no action");
//            }
            DataAccess da = new DataAccess();
            System.out.println("nothing");

        } catch (Exception e) {


        }
    }
}
  class DataAccess {
    public DataAccess() {
        //To change body of created methods use File | Settings | File Templates.
    }
}

如果我取消注释代码块一些虚拟语句,那么检测工作正常。有人见过这个吗?任何潜在的修复?

编辑:java6 和 java7 发生错误。

4

3 回答 3

2

最初的问题是由于 Cobertura 缺陷造成的。它不是固定的。Cobertura 现在支持辅助类路径的附加参数。. 这将用于解析检测所需的任何类。

cobertura-ant 任务文档

添加 auxClasspath

auxClasspath 参数旨在在检测期间删除 ClassNotFoundException。 有关此论点的更多信息,请参阅 https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation

于 2013-08-06T10:33:25.947 回答
1

我有一个类似的问题,它可能是一个错误,请参阅:https ://github.com/cobertura/cobertura/issues/49

您的测试用例可能有助于调试问题...

于 2013-07-23T15:56:50.680 回答
1

来自https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation

“这是因为在 cobertura 2.0 中的检测期间,我们使用 ASM 来重建 .class 文件。我们重建堆栈图,这是与 java 7 及之后的任何东西兼容的要求。这并不意味着我们重新编译代码,但是 ASM要求我们提供其他类的二进制文件,以防万一它需要查找任何超级方法。为了解决这个问题,我们使用了一个名为 auxClasspath 的参数。

将以下代码添加到您的 ant 文件 (build.xml) 应该可以解决该问题。

<path id="cobertura.auxpath">
<pathelement location="${bin}"/>
    </path>

    <target name="instrument_coverage" depends="init_coverage"
        description="Instruments source code for coverage measurement">
        <cobertura-instrument datafile="${coverage.datafile}">
            <fileset refid="coverage-files"/>
        <auxClasspath>
              <path refid="cobertura.auxpath" />
            </auxClasspath>
        </cobertura-instrument>
    </target>

这对我有用。

于 2016-02-10T11:56:47.510 回答