Java堆栈跟踪中的“未知源”,但行号在类文件中

时间:2012-02-09 18:38:45

标签: java ant

我写了一个超级简单的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中设置一个参数?

谢谢!

4 个答案:

答案 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>