ASM字节的仪器仪表,用于法进入/退出
-
13-09-2019 - |
题
我已经创建了一个JVMTI剂,并以下在高级别:
onClassLoadHook送字节的装类为一个独立的Java进程,将仪器类使用ASM
得到的字节来回载他们
在我的单独的java进程,文书中所载Java class我做到以下几点:
.. ..
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反编译器-我看到下面的反编译功能,我知道是错误的:
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);
}
谁能告诉我如果我做错了什么在这里?我唯一的线索是,如果而不是通过在作为一个参数以我的功能的这一指针,如果我通过在基本类型,一切工作的出finie.是不是有什么特别的有关这一指针,我需要管理?我比较字节,和我已经使用ASMIFIER得到一个线索是什么样的发言,我需要使用产生的权字节代码。
解决方案
它看起来像你的代码是否正确,与mv。visitCode().javap显示了预期字节代码。我猜你原来的反编译器只是不是在做正确的事情。
其他提示
也许它并不重要,但是你不是应该叫 super.visitCode()
?
@Override
public void visitCode() {
super.visitCode();
...
我会用 TraceClassVisitor 检查什么,正在产生。
不隶属于 StackOverflow