2010-03-29 51 views
15

¿Hay una utilidad similar a OllyDbg/SoftICE para java? Es decir. ejecutar clase (desde jar/con class path) y, sin código fuente, mostrar el desmontaje del código intermedio con la capacidad de paso/paso/buscar referencias/editar código intermedio específico en la memoria/aplicar edición al archivo ...¿Hay un desensamblador + depurador para java (ala OllyDbg/SoftICE para ensamblador)?

De lo contrario, ¿es posible escribir algo como esto (suponiendo que estamos dispuestos a vivir sin el punto de acceso durante la duración de la depuración)?

Editar: No estoy hablando de JAD o JD o Cavaj. Estos son buenos decompiladores, pero no quiero un decompilador por varias razones, lo más notable es que su salida es incorrecta (en el mejor de los casos, a veces simplemente incorrecta). No estoy buscando un mágico "bytes compilados para código Java" - Quiero ver los bytes reales que están a punto de ejecutarse. Además, me gustaría poder cambiar esos bytes (como en un depurador de ensamblaje) y, con suerte, volver a escribir la parte modificada en el archivo de clase.

Edit2: Sé que existe javap, pero lo hace de una sola manera (y sin ningún tipo de análisis). Ejemplo (código tomado de la documentación vmspec): Desde el código de Java, utilizamos "javac" para compilar esto:

void setIt(int value) { 
    i = value; 
} 
int getIt() { 
    return i; 
} 

a un archivo .class de Java. Usando javap -c puedo conseguir este resultado:

Method void setIt(int) 
    0 aload_0 
    1 iload_1 
    2 putfield #4 
    5 return 
    Method int getIt() 
    0 aload_0 
    1 getfield #4 
    4 ireturn 

Esto está bien para la parte desmontaje (no muy bueno sin análisis - "campo # 4 es Example.i"), pero no puedo encontrar a los dos otras "herramientas":

  1. Un depurador que repasa las instrucciones en sí (con pila, volcados de memoria, etc.), lo que me permite examinar el código y el entorno real.
  2. Una forma de revertir el proceso: edite el código desensamblado y vuelva a crear el archivo .class (con el código editado).

Respuesta

11

no creo que esto es realmente una respuesta completa, pero algunos indicadores que pueden proporcionar algo viable:

(1) En términos de ver y trabajar directamente con código de bytes de la vieja BCEL Class Construction Kit puede ser útil (es el solo editor de GUI para bytecode del que soy consciente).

(2) En términos de depuración y paso a través del bytecode, this Eclipse plugin, que se integra con el depurador de Eclipse puede satisfacer sus necesidades.

No conozco ninguna utilidad que combine estas características y le permita manipular bytecode mientras se está ejecutando el código (al menos de la misma manera que en OllyDbg, etc.). Sin embargo, Java debugger API debería ser capaz de soportar manipular el código en tiempo de ejecución (aunque, dada la naturaleza de HotSpot y JIT en general, no sé si sería posible reescribir una instrucción justo antes de invocarla --- el código de operación bytecode actualmente en ejecución es realmente una abstracción de cómo el intérprete elige implementar el op, a diferencia del código nativo donde el opcode desensamblado es, de hecho, la instrucción enviada a la CPU). Alternativamente, puede buscar en el Java Instrumentation API que proporciona una forma de redefinir el código de bytes en tiempo de ejecución.Y, por supuesto, any of the various open source bytecode manipulation libraries puede ayudar o proporcionar inspiración.

Y, por supuesto, siempre existe la opción de eludir toda la infraestructura de JVM y simplemente asociar un depurador al proceso de JVM. Hay un poco de discusión de este in this question y en this page linked from that question.

La conclusión, sin embargo, es que lo que parece que intenta lograr, aunque es un lugar común en el mundo del código nativo, no es una práctica común en el mundo Java (parte de la razón para usar Java es abstracción de todos los detalles sangrientos). Esto, y la naturaleza relativamente trivial de la descompilación de códigos de bytes (en comparación con, digamos, C++) ha llevado a una situación en la que este tipo de requisitos es escaso y también lo es este tipo de herramientas.

+0

Wow, gran respuesta. Lástima que no hay tal herramienta. Dudo que construya uno yo mismo (muy interesante, pero la presión en el trabajo, la vida, el conocimiento del dominio no es suficiente ...). Gracias por la respuesta muy completa. –

+0

+1 ¡toda esta información me ayudó mucho! =) Gracias – jyz

2

Eche un vistazo a JAD Decomplier para descompilar el código Java. A continuación, puede ejecutar un depurador integrado de IDE utilizando fuentes producidas. IDE puede ser IntelliJ, Eclipse o NetBeans. Este enfoque no es completamente automático, pero debería hacer el trabajo.

+0

No es lo que estoy buscando, consulte mi edición para obtener la respuesta completa. –

+0

Bueno, entonces la respuesta es "No existe tal cosa". –

+0

:(. ¿Existe alguna manera de crear tal cosa? ¿La API de depuración de VM lo admite? –

Cuestiones relacionadas