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
ASM CheckClassAdaptor.verify() da una gran respuesta: http://asm.ow2.org/
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.
- 1. Patrones de manipulación de códigos de bytes
- 2. compilador de códigos de bytes de Java en JavaScript
- 3. ¿Tipo de verificador para JavaScript?
- 4. ¿Las diferentes actualizaciones JDK producen diferentes códigos de bytes Java?
- 5. ¿Alguna guía/verificador de estilo R?
- 6. ¿Por qué PHP usa cachés de códigos de operación mientras que Java los compila a archivos de códigos de bytes?
- 7. Generador Acceleo autónomo
- 8. Crear código de bytes de Python de la lista de códigos de operación y argumentos?
- 9. Convirtiendo BCI (índices de códigos de bytes) a números de línea de código fuente
- 10. ZookeeperConnectionException en modo autónomo HBase
- 11. ¿Para qué sirve el Verificador de aplicaciones de Microsoft?
- 12. Servidor Socket.IO autónomo en Java
- 13. formateador de código Java autónomo/embellecedor/bonita impresora?
- 14. Generar métodos con tipos genéricos con generador de códigos de bytes Asm (ClassWriter)
- 15. ¿Algún C/C++ al compilador/intérprete de códigos de bytes no nativos?
- 16. ¿Hay un verificador de sintaxis PHP para Notepad ++?
- 17. Domando el verificador de tipos en Java Generics
- 18. ADB Códigos de error
- 19. lista de códigos infrarrojos?
- 20. Diseñando códigos de error
- 21. Códigos de idioma chino
- 22. JMS Consumidor autónomo con ActiveMQ y Spring
- 23. ¿Cómo hacer que Unix sea binario autónomo?
- 24. ¿Cómo obtener información de instrucciones de códigos de barras?
- 25. Fuentes de lectura de códigos
- 26. ¿Cuál es un buen enfoque para desarrollar un simple generador/verificador de números de serie?
- 27. Autónomo openid con múltiples identificadores de apertura por cuenta
- 28. ¿Puedo hacer un programa independiente autónomo de JavaScript?
- 29. Visual Studio 2010 - errores de enlace en autónomo funciona
- 30. ¿Cuál es el tamaño de un programa que usa LLVM/CLANG para una máquina virtual personalizada de códigos de bytes?
¿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. –