문제

높은 수준에서 다음을 수행하는 JVMTI 에이전트를 만들었습니다.

  • onclassloadhook로드 된 클래스의 바이트 코드를 ASM을 사용하여 클래스를 도구로 만드는 별도의 Java 프로세스로 보내기

  • 바이트 코드를 되돌리고로드하십시오

로드 된 Java 클래스 I를 도구로하는 별도의 Java 프로세스에서 다음을 수행합니다.

.. ..

    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();

                }

            }
        }

Java Decompiler를 사용 하여이 계측 후 작성된 클래스를 디 컴파일하려고 할 때 - 내가 알고있는 다음과 같은 디 컴파일 된 기능이 있습니다.

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

  }

내 기능은 실제로 다음과 같습니다.

public void func1(int a, int b) 
{

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

}

내가 여기서 잘못했는지 말해 줄 수 있습니까? 나의 유일한 단서는 내 기능에 대한 논쟁으로 들어가는 대신이 포인터가 원시 유형을 전달하면 모든 것이 피니를 작동한다는 것입니다. 내가 관리해야 할이 포인터에 대해 특별한 것이 있습니까? 바이트 코드를 비교했으며 Asmifier를 사용하여 올바른 바이트 코드를 생성하는 데 어떤 진술을 사용해야하는지에 대한 단서를 얻었습니다.

도움이 되었습니까?

해결책

mv.visitCode ()를 사용하여 코드가 올바른 것 같습니다. Javap은 예상 바이트 코드를 보여줍니다. 나는 당신의 원래 디 컴파일러가 옳은 일을하지 않았다고 생각합니다.

다른 팁

아마도 중요하지는 않지만 전화해서는 안됩니다. super.visitCode()?

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

나는 사용할 것이다 traceclassvisitor 생성 된 내용을 정확히 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top