2009-10-02 2 views

risposta

39

Se siete sulla riga di comando, quindi javap -l visualizzerà LineNumberTable e LocalVariableTable se presenti:

peregrino:$ javac -d bin -g:none src/Relation.java 
peregrino:$ javap -classpath bin -l Relation 
public class Relation extends java.lang.Object{ 
public Relation(); 

peregrino:$ javac -d bin -g:lines src/Relation.java 
peregrino:$ javap -classpath bin -l Relation 
public class Relation extends java.lang.Object{ 
public Relation(); 
    LineNumberTable: 
    line 1: 0 
    line 33: 4 

peregrino:$ javac -d bin -g:vars src/Relation.java 
peregrino:$ javap -classpath bin -l Relation 
public class Relation extends java.lang.Object{ 
public Relation(); 

    LocalVariableTable: 
    Start Length Slot Name Signature 
    0  5  0 this  LRelation; 

javap -c visualizzerà il file di origine, se presente all'inizio della decompilazione:

peregrino:$ javac -d bin -g:none src/Relation.java 
peregrino:$ javap -classpath bin -l -c Relation | head 
public class Relation extends java.lang.Object{ 
    ... 

peregrino:$ javac -d bin -g:source src/Relation.java 
peregrino:$ javap -classpath bin -l -c Relation | head 
Compiled from "Relation.java" 
public class Relation extends java.lang.Object{ 
    ... 

A livello di codice, guarderei a ASM anziché scrivere un altro lettore di codici bytecode.

-1

Mi sono imbattuto personalmente in questo problema e ho creato uno script Perl basato in parte sulla risposta di Pete che mostrava come utilizzare javap per trovare le informazioni di debug. Lo script si estende su questo automatizzando il processo di lettura attraverso JAR, e il controllo per eseguire il debug di informazioni su ogni classe dentro, e segnalando eventuali classi rotti che mancano le informazioni di debug:

https://gist.github.com/megahall/5416632

Speriamo che questo aiuterà il la prossima persona che incontra gli stessi problemi.

+2

Bene, il link è morto, quindi non serve molto ora. – OrangeDog