2010-02-26 14 views
7

Nel mio progetto di strumentazione bytecode, inciampo frequentemente su VerifyErrors. Tuttavia, il verificatore java predefinito fornisce poche informazioni su quale istruzione ha generato l'errore (fornisce solo il metodo e un piccolo messaggio). Esiste un verificatore bytecode stand-alone che fornisce un aiuto un po 'più avanzato nel localizzare l'errore, almeno nella precisa posizione dell'istruzione? Grazie.Verifier Bytecode stand alone

risposta

2

Come per qualsiasi progetto che coinvolge il bytecode JVM, vorrei prima verificare se lo BCEL ha qualcosa che potrebbe essere utile per voi. Inoltre, forse FindBugs può essere d'aiuto, anche se non sono sicuro se suppone che il codice bytecode verificabile inizi o meno.

+1

Perché non ci ho pensato. In realtà sto usando BCEL, ma non mi è mai capitato di controllare il suo verificatore. In realtà ha uno chiamato JustIce. –

2

Sono stato anche alla ricerca di qualcosa che potesse segnalare potenziale verificare errori, ma soprattutto IncompatibleClassChangeError s. Ho scritto un piccolo progetto di test con una classe API e un'altra classe client che chiama i metodi API, oltre a una classe principale per eseguire un verificatore; poi ha cambiato l'API, ricompilandolo ma non il client, e controllato per vedere cosa poteva essere catturato. Usato -target 7 anche se per ora non ci sono funzioni speciali di JDK 7.

Primo e più ovvio, Class.forName può trovare determinati errori nella firma della classe client, ma non sembra controllare i corpi del metodo per le chiamate a metodi API inesistenti e simili, anche se si chiama getDeclaredMethods; gli errori vengono segnalati dalla VM solo quando viene effettivamente eseguita la riga di codice problematica.

JustIce in BCEL 5.2 sembra essere più semplice;

org.apache.bcel.verifier.Verifier.main(new String[] {clazz}); 

fa il lavoro:

Pass 3a, method number 1 ['public void m()']: 
VERIFIED_REJECTED 
Instruction invokestatic[184](3) 4 constraint violated: 
    Referenced method 'x' with expected signature '()V' not found in class 'API'. 
    .... 

ho provato ASM 4.0, ma

org.objectweb.asm.util.CheckClassAdapter.main(new String[] {clazz}); 

non funziona; forse controlla il formato dei metodi, ma non il collegamento. Inlining main e passando checkDataFlow=true non aiuta.

Cercando, ho trovato anche https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java ma non sono riuscito a trovare alcun modo per farlo funzionare; il test dell'unità di accompagnamento genera un ClassNotFoundException durante l'esecuzione.

Problemi correlati