roe*_*erj 5 java debugging jvm stack-trace
我有一个非常令人困惑的情况:
我有一个使用行信息编译的类(使用验证javap -l
)。此类通过 ASM 进行加载和检测。我验证了是否加载了正确的类(即不是来自其他地方的过时的类文件)。我还确保ClassReader.SKIP_DEBUG
未设置 ASM 标志。现在,如果我打电话Thread.currentThread().getStackTrace()
,我会收到StackTraceElement
有关该类错过线路信息的信息。在 Eclipse 中调试时,行信息显示在堆栈跟踪中。我还确保 JVM 启动-Xint
只是为了确保在 JIT 编译代码时信息不会被删除,作为优化。
最令人困惑的是:尽管所有类都以相同的方式加载和检测,但这仅适用于某些类,而不适用于所有类。这是主要原因,我认为这与 JVM 有关。
所以我的问题是:JVM 是否会忽略堆栈跟踪中的行信息,如果是的话,何时以及如何防止这种情况发生?
编辑:只是为了弄清楚:这是我面前的源文件的类文件,而不是第三方库的类文件。从上面应该可以清楚地看出,我努力确保信息位于字节码中。
编辑:现在我什至找到了一个示例,其中一个StackTraceElement
具有行号信息,而另一个没有,并且它们关心同一类的不同方法!
我想知道堆栈跟踪中报告的行(或者不是)是否是在 ASM 检测您的类时生成的。由于它们在编译后进行了修改,因此任何行号都不会出现在类文件中,因此类加载器无法使用它们(或由 javap 报告)。我在运行时代码生成方面没有太多经验,所以这只是一个猜测,但也许你可以考虑一下。
归档时间: |
|
查看次数: |
739 次 |
最近记录: |