我已经编写了一个超级简单的java类,它会按照应该的方式抛出异常。然而,我得到的堆栈跟踪看起来是这样的:
java.lang.RuntimeException: hello
at Main.go(Unknown Source)
at Main.main(Unknown Source)
注意:堆栈跟踪中没有行号,我希望有。
当你在谷歌上搜索这个问题时,你会发现答案都是关于在编译时添加正确的参数,以确保行号真正进入类文件。然而,我不认为这是我的问题,因为我的ant build.xml 中有这个
<javac
debug="true"
debuglevel="lines,vars,source"
includeAntRuntime="false"
classpathref="classpath.compile"
srcdir="${src.dir}"
destdir="${build.classes}" />
此外,根据javap的说法,看起来行号确实出现在:中
$ javap -l ./build/classes/Main | head -n 9
public class Main extends java.lang.Object{
public Main();
LineNumberTable:
line 14: 0
line 22: 4
line 23: 15
line 24: 26
那是什么呢?当我运行代码时,是否需要在jvm中设置参数?
谢谢!
我认为正确的方法是:
<javac debug="true" debuglevel="lines,vars,source"
请注意,行、vars、源
在另一个问题上找到了这个答案:
这通常与缺少调试信息有关。你是可能使用JRE(而不是JDK),其中不包括调试信息对于rt.jar类。尝试使用完整的JDK,您将在堆栈跟踪
我遇到了完全相同的问题。在我们的环境中,它有助于关闭优化标志:
<javac optimize="off" ...
显然Ant并没有忽略属性优化,尽管Ant Doc对属性说"优化"(我们使用的是Java 1.7):
指示是否应使用优化编译源;注意,Sun从JDK1.3开始的javac只是忽略了这个标志(因为编译时优化是不必要的)。
<property name="srcdir" location="src/"/>
<property name="builddir" location="build/"/>
<target name="compile">
<exec executable="javac">
<arg value="${srcdir}/*" />
<arg value="-d" />
<arg value="${builddir}"/>
</exec>
</target>