我有一个非常混乱的情况:
我有一个带行信息编译的类(使用
最令人困惑的是:尽管所有类都被加载和仪器化,但这仅适用于某些类,而不是所有类。这就是我认为这与JVM有关的主要原因。
所以我的问题是:JVM是否省略堆栈跟踪中的行信息,如果是,请问何时以及如何防止这种情况发生?
编辑:仅为使事情清晰明了:这是面前源文件的类文件,而不是第三方库的类文件。正如上文所述,我努力确保信息在字节码中。
编辑:现在,我甚至找到了一个例子,其中一个
我有一个带行信息编译的类(使用
javap -l
进行验证)。该类被加载并使用ASM进行仪器化。我验证了正确的类被加载(即不是来自其他地方的过时类文件)。而且,我还确保ASM标志ClassReader.SKIP_DEBUG
未设置。现在,如果我调用Thread.currentThread().getStackTrace()
,我将得到有关此类的StackTraceElement
,其中缺少行信息。在Eclipse中调试时,堆栈跟踪中显示行信息。我还确保JVM以-Xint
启动,只是为了确保在代码被JIT编译时,不会因为优化而擦除信息。最令人困惑的是:尽管所有类都被加载和仪器化,但这仅适用于某些类,而不是所有类。这就是我认为这与JVM有关的主要原因。
所以我的问题是:JVM是否省略堆栈跟踪中的行信息,如果是,请问何时以及如何防止这种情况发生?
编辑:仅为使事情清晰明了:这是面前源文件的类文件,而不是第三方库的类文件。正如上文所述,我努力确保信息在字节码中。
编辑:现在,我甚至找到了一个例子,其中一个
StackTraceElement
具有行号信息,而另一个没有,并且它们涉及来自同一类的不同方法!
LineNumberTable
来补偿你添加的任何字节码? - parsifaldefineClass()
之前转储类的字节数组? - biziclopLineNumberTable
属性将字节码偏移量与行号关联起来。如果表中的字节码偏移量与被调用的代码不对应,我可以想象 JVM 会感到困惑(尽管我期望它只会给出错误的行号)。 - parsifal