Incorrect Parameter Order

"ThanhVu (Vu) Nguyen" <[email protected]> Fri, 01 Dec 2017 23:30:16 +0000
Newsgroups gmane.comp.java.objectweb.asm
Message-ID <CA+OL+MgQedEirWs+AJ6hZm9sbaC8GFOy4AnOZ1YUvrrSxwxiEA@mail.gmail.com>
I want to instrument a function to print out its parameter values
For example,  void trace(b,d){}   becomes  void trace{System.out.println(b+
" " + d);}

And trace is invoked from another function, e.g.,
foo(){
   int a = 0;
   int b = 1;
   int c = 2;
   int d = 3;
   trace(b,d);
}

So after the instrument I want the program to print
1 3  when running foo

I wrote some code for ASM to do it, but I did it wrong because it always
print
0 1  (i.e., . the values of a and b.  I suspect I didn't use the correct
arg index, but I am not sure how to make it right.

Essentially my code contains a loop in visitMethodInsn that prints
something like

mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out",
"Ljava/io/PrintStream;");
mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>",
"()V", false);
mv.visitVarInsn(ILOAD, 0);   //load index 0
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
"(I)Ljava/lang/StringBuilder;", false);
mv.visitLdcInsn(" ");
 mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
mv.visitVarInsn(ILOAD, 1);   //load index 1
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
"(I)Ljava/lang/StringBuilder;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString",
"()Ljava/lang/String;", false);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println",
"(Ljava/lang/String;)V", false);

....
}


-- 
You receive this message as a subscriber of the [email protected] mailing list.
To unsubscribe: mailto:[email protected]
For general help: mailto:[email protected]?subject=help
OW2 mailing lists service home page: http://www.ow2.org/wws