2012-02-09 45 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開始就忽略了此標誌(因爲不需要編譯時優化)。