我有一个非常令人困惑的情况:
我有一个使用行信息编译的类(使用 javap -l
验证)。此类通过 ASM 加载和检测。我确认加载了正确的类(即不是来自其他地方的陈旧类文件)。而且我还确保未设置 ASM 标志 ClassReader.SKIP_DEBUG
。现在,如果我调用 Thread.currentThread().getStackTrace()
,我会得到关于这个类的 StackTraceElement
s,但它错过了行信息。在 Eclipse 中调试时,行信息显示在堆栈跟踪中。我还确保 JVM 以 -Xint
启动,以确保在 JIT 编译代码时不会将信息作为优化删除。
最令人困惑的是:尽管所有类的加载和检测都是相同的,但这仅适用于某些类,而不适用于所有类。这是主要原因,为什么我认为这与 JVM 有关。
所以我的问题是:JVM 是否会忽略堆栈跟踪中的行信息,如果是这样,我何时以及如何防止这种情况发生?
编辑: 澄清一下:这是我面前的源文件的类文件,而不是第 3 方库的类文件。从上面应该很清楚,我努力确保信息在字节码中。
编辑: 现在我什至发现了一个例子,其中一个 StackTraceElement
有行号信息而另一个没有,他们关注来自同一类 的不同方法 !
最佳答案
我想知道在 ASM 检测您的类时是否生成了堆栈跟踪中报告的行(或不报告)。由于它们是在编译后修改的,任何行号都不会出现在类文件中,因此它们对类加载器不可用(或由 javap 报告)。我在运行时代码生成方面没有很多经验,所以这只是一个猜测,但也许您可以考虑一下。
关于java - JVM 何时会在堆栈跟踪中忽略行信息,我该如何防止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12307951/