4

我有一个非常混乱的情况:

我有一个使用行信息编译的类(使用验证javap -l)。此类使用 ASM 加载和检测。我确认加载了正确的类(即不是来自其他地方的陈旧类文件)。而且我还确保ClassReader.SKIP_DEBUG没有设置 ASM 标志。现在,如果我打电话Thread.currentThread().getStackTrace(),我会收到StackTraceElement有关错过线路信息的此类的信息。在 Eclipse 中调试时,行信息显示在堆栈跟踪中。我还确保启动 JVM-Xint只是为了确保在 JIT 编译代码时不会将信息作为优化删除。

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

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

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

编辑:现在我什至找到了一个例子,其中一个StackTraceElement有行号信息而另一个没有,他们关心的是同一类的不同方法!

4

3 回答 3

1

这与类文件的编译方式有关。看看这里:

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javac.html

并在 -g 标志周围查找“调试信息”。如果您添加 -g,您的代码将包含行号(以及许多其他有用的信息)。

恐怕这不会将调试信息追溯添加到第 3 方库中。您必须了解获取源代码或从供应商处获取调试版本。我发现这通常是没有必要的。

于 2012-09-06T20:37:24.393 回答
1

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

于 2012-09-06T20:52:36.193 回答
0

并非所有行号都在 JVM 中可用。一些第三方库可能在没有行号的情况下编译,特别是非开源库,甚至一些 Java 类已经保护了正在执行加密或其他一些受保护逻辑的源代码。简而言之,并不是所有的东西都会有行号。

于 2012-09-06T20:36:07.253 回答