I am doing Java bytecode analyse. I want to keep tracking each changing state of local variables. The idea is quite like a debugger. For example, I have a Java source code like
public class Foo { public void main() { printOne(); } public void printOne() { int i=11110; String hello="hello"; } By using ASM 5.0 I could visit line number ,local variable name ,mehtod name ,var instruction and so on. The visitor look like below
@Override public void visitLineNumber(int line, Label start) { System.out.println("line: "+line+" "); mv.visitLineNumber(line, start); } @Override public void visitLocalVariable(String name, String desc,String signature, Label start, Label end, int index) { System.out.println("local variable:"+name); mv.visitLocalVariable(name, desc, signature, start, end, index); } @Override public void visitVarInsn(int opcode, int var) { System.out.println("var instruction"+Integer.toHexString(opcode)); mv.visitVarInsn(opcode, var); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { System.out.println("method"); mv.visitMethodInsn(opcode, owner, name, desc, itf); } The question is where do I inject a tracer(just a static method call), and look for variable value on stack and pass to the tracer as parameter?
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "path/to/Tracer", "trace", "(Ljava/lang/String;)V",false);