我写了一个超级简单的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中设置一个参数?
谢谢!
答案 0 :(得分:24)
我认为正确的方法是:
<javac debug="true" debuglevel="lines,vars,source"
请注意行,变量,源
之间没有空格答案 1 :(得分:2)
在another question上找到了这个答案:
这通常与缺少调试信息有关。你是 可能使用JRE(不是JDK),它不包含调试信息 对于rt.jar类。尝试使用完整的JDK,您将获得适当的位置 堆栈跟踪
答案 2 :(得分:1)
我有完全相同的问题。在我们的环境中,它有助于关闭optimize-flag:
<javac optimize="off" ...
显然Ant确实不忽略属性优化,尽管Ant-Doc表示属性“优化”(我们使用的是Java 1.7):
指示是否应使用优化编译源;默认为关闭。请注意,Sun的javac从JDK 1.3开始忽略了这个标志(因为编译时优化是不必要的)。
答案 3 :(得分:0)
<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>