2012-02-09 7 views
18

Napisałem super prostą klasę języka Java, która rzuca wyjątki tak, jak powinna. Jednak ślad stosu Dostaję wygląda następująco:"Nieznane źródło" w śledzeniu stosu Java, ale numery linii są w pliku klasy

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

Uwaga: nie ma numery linii w ślad stosu i chciałbym tam być.

Odpowiedzi znalezione podczas wyszukiwania w Google tego problemu polegają na dodaniu prawidłowych parametrów w czasie kompilacji, aby upewnić się, że numery linii faktycznie znajdują się w pliku klasy. Jednak nie wierzę, że to mój problem, jak mam to w moim ant build.xml

<javac 
    debug="true" 
    debuglevel="lines,vars,source" 
    includeAntRuntime="false" 
    classpathref="classpath.compile" 
    srcdir="${src.dir}" 
    destdir="${build.classes}" /> 

Ponadto, zgodnie z javap, wygląda numerów linii udało się w:

$ 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 

Co daje? Czy jest jakiś parametr, który muszę ustawić w jvm po uruchomieniu kodu?

Dzięki!

+0

Czy używasz jvm w trybie serwera, tzn. 'Java -server'? Czy uruchamiasz instalację jre lub jdk? – shams

+0

nie używając -serwera i używam jdk – andersonbd1

+0

Nigdy nie zdawałem sobie sprawy, że to może być ustawione w javacu w Ant ... Zastanawiam się, dlaczego moje stosy stacków stały się ostatnio mniej przydatne. : P Zmienione teraz, a życie jest lepsze – Panky

Odpowiedz

22

myślę poprawny sposób to:

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

Uwaga nie ma spacji między linii, Vars, źródło

+0

Czy jedyna różnica jest prawdziwa? Jeśli tak, spróbowałem i to nie pomogło. W każdym razie dzięki. – andersonbd1

+1

Czy możesz opublikować cały tag ? – bvanvelsen

+0

Preferuję debugowanie = włączone – lwpro2

2

uznało tę odpowiedź na another question:

ta jest zwykle związane z brakujących informacji debugowania. Jesteś prawdopodobnie używając JRE (nie JDK), który nie zawiera informacji debugowania dla klas rt.jar. Spróbuj użyć pełnej JDK, dostaniesz odpowiednie lokalizacje w ślad stosu

+0

Znalazłem również notatkę, ale nie sądzę, że dotyczy mnie. # 1) Używam jdk i # 2) Myślę, że ma to znaczenie tylko dlatego, że skompilowane pliki klas dla klas api java ... jednak jest to moja własna klasa niestandardowa – andersonbd1

+0

Anderson ma rację, jdk będzie tylko wypełniać w informacji o debugowaniu składników sdk. Na dodatek jre nie zawiera kompilatora. Myślę, że może nie powinieneś opublikować tego. –

1

Miałem dokładnie ten sam problem. W naszym środowisku to pomogło aby wyłączyć zoptymalizować-flag

<javac optimize="off" ... 

Najwidoczniej Ant robi nie ignorować atrybut optymalizacji, chociaż Ant-Doc mówi o atrybut „Optymalizacja” (i używamy Java 1.7):

Wskazuje, czy źródło powinno być kompilowane z optymalizacją; domyślnie wyłączone. Zauważ, że ta flaga jest po prostu ignorowana przez javac Sun zaczynając od JDK 1.3 (ponieważ optymalizacja kompilacji nie jest konieczna).

Powiązane problemy