2010-02-26 11 views
7

En mi proyecto de instrumentación de código de bytes, tropiezo con frecuencia en VerifyErrors. Sin embargo, el verificador Java predeterminado proporciona poca información sobre qué instrucción dio como resultado el error (solo proporciona el método y un pequeño mensaje). ¿Hay algún verificador de bytecode autónomo que brinde ayuda un poco más avanzada para localizar el error, al menos la ubicación precisa de la instrucción? Gracias.Verificador de códigos de bytes autónomo

Respuesta

2

Al igual que con cualquier proyecto que implique bytecode de JVM, primero verificaría si el BCEL tiene algo que pueda ser útil para usted. Además, tal vez FindBugs pueda ayudar, aunque no estoy seguro de si asume bytecode verificable para empezar o no.

+1

¿Por qué no pensé en eso? En realidad estoy usando BCEL, pero nunca se me ocurrió verificar su verificador. En realidad, tiene uno llamado JustIce. –

2

Yo también estaba buscando algo que pudiera reportar potencial verificar errores, pero especialmente IncompatibleClassChangeError s. Escribí un pequeño proyecto de prueba con una clase API y otra clase de cliente que llamaba a los métodos API, más una clase principal para ejecutar un verificador; luego cambió la API, recompilando pero no el cliente, y se verificó para ver qué se podía atrapar. Usó -target 7 aunque no hay características especiales de JDK 7 por ahora.

Primero y más obviamente, Class.forName puede encontrar ciertos errores en la firma de la clase del cliente, pero no parece verificar los cuerpos del método para llamadas a métodos API inexistentes y similares, incluso si llama al getDeclaredMethods; los errores son reportados por la VM solo cuando la línea problemática de código se ejecuta realmente.

JustIce en BCEL 5.2 parece ser el más fácil;

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

hace el trabajo:

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'. 
    .... 

Probé ASM 4.0, pero

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

no funciona; tal vez comprueba el formato de los métodos, pero no el enlace. Alinear main y pasar checkDataFlow=true no ayuda.

Buscando, también encontré https://kenai.com/hg/maxine~maxine/file/8429d3ebc036/com.oracle.max.vm/test/test/com/sun/max/vm/verifier/CommandLineVerifier.java pero no pude encontrar ninguna manera de hacer esto; la prueba unitaria que acompaña arroja un ClassNotFoundException cuando se ejecuta.

Cuestiones relacionadas