바이트 코드 계측기 생성 Java Verifier 오류
-
05-07-2019 - |
문제
Java 프로그램을 위해 바이트 코드 계측을하기 위해 ASM을 사용하고 있습니다. 내가하고있는 일은 간단합니다 - 메소드를 계측 할 때 명령어가 풋 필드 인 경우 명령 직전에 DUP_X1을 수행 한 다음 Putfield를 방문하여 DUP의 스택 항목이 포함 된 인수와 함께 함수 호출을 주입하십시오.
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");
}
}
코드는 계측 전후에 다음과 같습니다.
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);
}
그러나 계측 코드를 실행하면 다음과 같이받습니다.
java.lang.verifyerror : 스택에서 개체/배열을 찾을 것으로 기대합니다.
이것에 대한 도움을 제공 할 수 있습니까?
해결책
계측에 약간의 구멍이 있습니다. 예를 들어, 정적 메소드 내부에 있는지 확인하지 않으므로이 변수가 있습니다.
제휴하지 않습니다 StackOverflow