Pregunta

He creado un agente JVMTI que hace lo siguiente en un nivel alto:

  • onClassLoadHook enviar los códigos de byte para la clase cargado a un proceso de Java independiente que instrumento la clase utilizando ASM

  • obtener los códigos de bytes hacia atrás y cargarlos

En mi proceso de Java independiente que los instrumentos de la clase Java cargado hago lo siguiente:

.. ..

    cr = new ClassReader(inBytes, offset, inLen);
    cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

    ClassAdapter ca = new ClassAdapter(cw) {
    ..
    ..

        @Override
        public MethodVisitor visitMethod(final int access,
                                         final String name,
                                         final String desc,
                                         String signature,
                                         String[] exceptions) {

            return new MethodAdapter(mv) {

                @Override
                public void visitCode() {

                    mv.visitVarInsn(Opcodes.ALOAD, 0);
                    mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/Tester", "callTestStatic3", "(Ljava/lang/Object;)V");
                    mv.visitCode();

                }

            }
        }

Cuando intento descompilar la clase que se escribe después de esta instrumentación utilizando Java Decompiler - Veo la siguiente función de descompilación que sé que es malo:

  public void func1(int arg1, int arg2)
  {
    int b;
    Tester.callTestStatic3(???); 
    System.out.println("arg = " + a + " b = " + b);

  }

porque mi función en realidad se parece a esto:

public void func1(int a, int b) 
{

    System.out.println("arg = " +a + " b = " +b);

}

Puede alguien decirme si hice algo mal aquí? Mi única pista es que si en lugar de pasar como argumento a la función de este puntero, si paso de los tipos primitivos, todo sale finie. ¿Hay algo especial en el puntero esto que necesito para manejar? He comparado el código de bytes, y yo he utilizado ASMIFIER para obtener una pista en cuanto a las declaraciones de lo que tengo que usar para generar el código de bytes adecuados.

¿Fue útil?

Solución

Parece que el código es correcto, con mv.visitCode (). javap muestra los códigos de bytes esperados. Supongo que tu decompilador original, simplemente no estaba haciendo lo correcto.

Otros consejos

Tal vez no importa, pero no debe estar llamándote super.visitCode()?

@Override
public void visitCode() {
  super.visitCode();
  ...

TraceClassVisitor para comprobar exactamente lo que se está generando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top