java - JVM 何时会在堆栈跟踪中省略行信息,我该如何防止它发生?

标签 java debugging jvm stack-trace

我有一个非常困惑的情况:

我有一个使用行信息编译的类(使用 javap -l 验证)。此类使用 ASM 进行加载和检测。我验证了是否加载了正确的类(即不是来自其他地方的陈旧类文件)。我还确保未设置 ASM 标志 ClassReader.SKIP_DEBUG。现在,如果我调用 Thread.currentThread().getStackTrace(),我会得到与此类相关的 StackTraceElement,但缺少行信息。在 Eclipse 中调试时,行信息显示在堆栈跟踪中。我还确保 JVM 以 -Xint 启动,只是为了确保在对代码进行 JIT 编译时作为优化不会删除信息。

最令人困惑的是:尽管所有类都以相同的方式加载和检测,但这只适用于某些类,而不是所有类。这是主要原因,我认为这与 JVM 有关。

所以我的问题是:JVM 是否会在堆栈跟踪中忽略行信息,如果是,我应该何时以及如何防止这种情况发生?

编辑: 澄清一下:这是我面前的源文件的类文件,而不是第 3 方库的类文件。正如上面应该清楚的那样,我努力确保信息在字节码中。

编辑:现在我什至发现了一个例子,其中一个 StackTraceElement 有行号信息而另一个没有,他们关注不同的方法 来自同一个类(class)!

最佳答案

我想知道在您的堆栈跟踪中报告的行(或实际上没有)是否是在 ASM 检测您的类时生成的。由于它们是在编译后修改的,因此任何行号都不会出现在类文件中,因此它们对类加载器不可用(或由 javap 报告)。我在运行时代码生成方面没有太多经验,所以这只是一个猜测,但也许你可以考虑一下。

关于java - JVM 何时会在堆栈跟踪中省略行信息,我该如何防止它发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307951/

相关文章:

java - mysql 替换为使用 hibernate

java - 使用 Spring 电子邮件抽象层阅读邮件

java - setOnClickListener 方法中的重复代码 - android - java

调试 JNI 模块中的特定访问冲突

wpf - 如何调试 ViewModel 与 View 的绑定(bind)?

garbage-collection - JRuby-如何启动垃圾收集器?

java - 如何在 JDK 中找到完整的平台依赖陷阱列表,如时区、编码、行尾等?

java - 更改指向实例的所有对象

python - 转到 pdb 中的顶部框架(python 调试器)

java - 如何用 Java 编写正确的微基准测试?