2012-04-02 14 views
10

Encuentro bytecode VerifyErrors notoriamente difícil de depurar. La JVM proporciona muy pocos comentarios, normalmente solo la clase actual y, a veces, el método.Buenas herramientas para depurar VerifyError?

Algunos ejemplos de errores que típicamente encuentran cuando manualmente ingeniería bytecode través ASM o Jasmin:

  • Stack size too large
  • Unable to pop operand off an empty stack
  • Falling off the end of the code
  • Expecting to find object/array on stack
  • Incompatible object argument for function call
  • Inconsistent stack height 4 != 2

(Para ser claro; Yo sé lo que todo esto significa , estoy interesado en las herramientas o técnicas para depurar la causa de ellos)

Mi Pregunta:. ¿Hay alguna herramienta por ahí que proporciona información detallada sobre estos tipos de errores ? por ejemplo apreciaría información tal como

  • javap -como salida
  • referencias a la línea-números (o desplazamientos de bytes de código de operación)
  • operando información de la pila (tipos/profundidad) en cada línea
  • más mensajes de error descriptivos
+1

http://stackoverflow.com/questions/3438404/java-lang-verifyerror ¿Te puede ayudar? – Tom

+0

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatk%2FEX4AA2.htm ¿Lo ayudó? – Tom

Respuesta

2

El Kraktau project que he escrito es útil para la depuración de errores de verificación. Es capaz de dar los offsets de bytecode donde ocurre el error, y la pila y la información de tipo local para cada instrucción. Incluso maneja correctamente banderas e información de máscara para subrutinas. Es capaz de detectar prácticamente todos los errores.

Aún no hay una interfaz específica para imprimir la información de verificación, pero si todavía me queda qué tipo de funcionalidad desea, puedo agregar una. Mientras tanto, al intentar descompilar su clase con Krakatau se imprimirá un mensaje de error con información sobre el error de verificación y la información de tipo de la instrucción donde ocurrió.

Actualización: Krakatau ya no realiza la verificación debido a problemas de rendimiento. Si desea realizar la verificación, deberá realizar la confirmación commit 3724c05ba11ff6913c01ecdfe4fde6a0f246e5db.

Cuestiones relacionadas