"Unknown Source" Java 堆栈跟踪中,但行号在类文件中



我已经编写了一个超级简单的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>

相关内容

  • 没有找到相关文章

最新更新