Código de bytes de Java instrumentação gerando verificador de erro
-
05-07-2019 - |
Pergunta
Eu estou usando ASM, a fim de fazer a instrumentação bytecode para programas Java. O que estou fazendo é simples - quando instrumentar um método, se a instrução é um PUTFIELD, basta fazer um direito DUP_X1 antes da instrução, em seguida, visitar o PUTFIELD e injetar uma chamada de função com um argumento que inclui entrada do DUP'ed pilha.
public void visitFieldInsn(
int opcode,
String owner, // owner of this field...
String name,
String desc) {
boolean did_dup = false;
if(opcode == Opcodes.PUTFIELD) {
if(!owner.equals("java/lang/System")) {
if (desc.startsWith("L")) {
mv.visitInsn(Opcodes.DUP_X1);
did_dup = true;
}
}
}
mv.visitFieldInsn(opcode, owner, name, desc);
if (did_dup) {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
}
}
Os olhares código como este antes e depois da instrumentação, respectivamente:
public void setA(ClassA classa)
{
refA = classa;
eyeColor = classa.eyeColor;
}
public void setA(ClassA classa)
{
ASide.updateG(refA = classa, this);
ASide.updateG(eyeColor = classa.eyeColor, this);
}
Mas quando eu executar o código instrumentado, eu recebo:
java.lang.VerifyError: Esperando encontrar objeto / array na pilha
Você pode oferecer tem qualquer ajuda sobre isso?
Solução
Há alguns buracos em sua instrumentação. Por exemplo, ele não verifica se você estiver dentro método estático, então esta variável está presente.