2012-02-09 77 views
18

我写了一个超级简单的java类,它抛出异常,因为它应该。然而,堆栈跟踪我得到这个样子的:Java堆栈跟踪中的“未知源”,但行号在类文件中

java.lang.RuntimeException: hello 
     at Main.go(Unknown Source) 
     at Main.main(Unknown Source) 

注:有在堆栈跟踪没有行号,我想那里是。

当你用google搜索这个问题时,你会发现所有的答案都是关于在编译时加入正确的参数,以确保行数实际上使它进入类文件。不过,我不相信这是我的问题,因为我有这个在我的蚂蚁的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

你是否在服务器模式下运行jvm,即'java -server'?另外,你是从jre还是jdk安装中运行? – shams 2012-02-09 18:42:52

+0

不使用-server,我正在使用jdk – andersonbd1 2012-02-09 18:48:40

+0

我从来没有意识到这可以在Ant中的javac中设置......我想知道为什么我的堆栈最近变得不那么有用。 :P现在改变,生活更好 – Panky 2012-10-08 20:44:31

回答

22

我认为正确的做法是:

<javac debug="true" debuglevel="lines,vars,source" 

注有线之间没有空格,乏,源

+0

唯一不同的真实vs?如果是这样,我尝试了它,并没有帮助。谢谢,不过。 – andersonbd1 2012-02-09 18:52:56

+1

你可以发布整个标签吗? – bvanvelsen 2012-02-09 18:58:48

+0

我更喜欢debug = on – lwpro2 2012-05-15 06:38:18

2

上找到another question这样的回答:

这通常是与缺少调试信息。您可能使用的是JRE(不是JDK),它不包含用于rt.jar类的调试信息 的 。尝试使用完整的JDK,你会得到正确的位置在 堆栈跟踪

+0

我发现了这个音符,但我不认为适用于我。 #1)我使用的是JDK和#2)我认为这只是因为Java api类的编译后的类文件...但是,这是我自己定制的类 – andersonbd1 2012-02-09 18:51:16

+0

Anderson是正确的,jdk只会填充在sdk组件的调试信息中。最重要的是_jre不包含compiler_。我想也许你不应该发布这个。 – 2012-06-23 22:39:06

1

我有完全相同的问题。在我们的环境中它帮助关掉优化标志:

<javac optimize="off" ... 

显然蚂蚁确实忽略属性优化,虽然Ant-Doc说,对属性“优化”(我们使用的是Java 1.7):

指示源是否应该优化编译;默认为关闭。请注意,Sun的javac从JDK 1.3开始就忽略了此标志(因为不需要编译时优化)。