首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM何时在堆栈跟踪中省略行信息,以及如何防止它?

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

Stack Overflow用户
提问于 2012-09-06 20:32:54
回答 3查看 647关注 0票数 4

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

我有一个用行信息编译的类(使用javap -l验证)。这个类将被加载并使用ASM进行测试。我验证了是否加载了正确的类(即不是来自其他地方的陈旧类文件)。我还确保没有设置ASM标志ClassReader.SKIP_DEBUG。现在,如果我调用Thread.currentThread().getStackTrace(),我会得到关于这个类的StackTraceElement,它遗漏了行信息。在Eclipse中调试时,行信息显示在堆栈跟踪中。我还确保JVM是用-Xint启动的,只是为了确保在编译代码时不将信息作为优化擦除。

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

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

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

编辑:,现在我甚至发现了一个例子,其中一个StackTraceElement有行号信息,另一个没有,他们关心的是来自同一个类的不同方法--

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-06 20:52:36

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-06 20:37:24

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

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

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

恐怕这不会将调试信息追溯到第三方库中。您必须了解如何获取源代码,或者从供应商那里获得调试构建。我发现这通常是不必要的。

票数 1
EN

Stack Overflow用户

发布于 2012-09-06 20:36:07

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12307951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档