JVM何时在堆栈跟踪中省略行信息,如何防止它?

时间:2012-09-06 20:32:54

标签: java debugging jvm stack-trace

我的情况很混乱:

我有一个使用行信息编译的类(使用javap -l验证)。该类通过ASM加载和检测。我验证了加载了正确的类(即不是来自其他地方的陈旧类文件)。我还确保未设置ASM标志ClassReader.SKIP_DEBUG。现在,如果我拨打Thread.currentThread().getStackTrace(),我会收到StackTraceElement个关于这个错过行信息的课程。在Eclipse中进行调试时,行信息显示在堆栈跟踪中。我还确保JVM以-Xint启动,以确保在代码编译JIT时信息不会被删除为优化。

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

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

编辑:只是为了清楚说明:这是我面前的源文件的类文件,而不是第三方库。从上面应该清楚,我努力确保信息在字节码中。

修改现在,我甚至找到了一个示例,其中一个StackTraceElement有行号信息,另一个没有' t他们关注不同的方法 来自同一个班级

3 个答案:

答案 0 :(得分:1)

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

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

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

我担心,这不会追溯性地将调试信息添加到第三方库。您必须了解获取源代码或从供应商处获取调试版本。我发现这通常没有必要。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

并非JVM中的所有行号都可用。某些第三方库可能没有行号编译,特别是非开源库,甚至一些Java类也有受保护的源代码,它们正在进行加密或其他一些受保护的逻辑。简而言之,并非一切都会有行号。