Btw, did you checked if your original (not instrumented) classes are acceptible? It is so stupid mistake, that you have to be genious to avoid it, at least I can not :))).
Beside this: if you copy method from one class to another (i do not what are your real application), you must change the constant pool indices of the instructions.
Konstantin Scheglov wrote:
I use following code to instrument one class. But when I instrument some classes and try to print debug information, I receive following exception.
org.apache.bcel.classfile.ClassFormatException: Invalid constant pool reference: 28088. Constant pool size is: 1024 at org.apache.bcel.classfile.ConstantPool.getConstant(ConstantPool.java:242) at org.apache.bcel.classfile.Utility.codeToString(Utility.java:369) at org.apache.bcel.classfile.Utility.codeToString(Utility.java:166) at org.apache.bcel.classfile.Code.toString(Code.java:326) at org.apache.bcel.classfile.Code.toString(Code.java:352) at java.lang.String.valueOf(String.java:2131) at java.io.PrintStream.print(PrintStream.java:462) at java.io.PrintStream.println(PrintStream.java:599) at ru.nlmk.eclipse.plugins.profiler.trace.Trace.instrumentClass(Trace.java:1190) at ru.nlmk.eclipse.plugins.profiler.trace.test.TestBCEL.main(TestBCEL.java:23)
As you can see, I just copy code from one method to another (in real application I change code a little). And when I try to load this class in real application I receive exception like this from JVM: "VerifyError: Illegal constant pool index".
public static JavaClass instrumentClass(JavaClass clazz) throws Exception { ClassGen classGen = new ClassGen(clazz); ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); classGen.setConstantPool(cp); // for (int i = 0; i < clazz.getMethods().length; i++) { Method method = clazz.getMethods()[i]; if (method.isAbstract() || method.isNative()) continue; if (method.getName().equals("finalize")) continue; MethodGen mg = new MethodGen(method, clazz.getClassName(), cp); mg.setConstantPool(cp); Method newMethod = mg.getMethod(); if (m_Debug) { System.out.println(method.getCode()); System.out.println(newMethod.getCode()); } classGen.replaceMethod(method, newMethod); } // JavaClass newClazz = classGen.getJavaClass(); newClazz.setConstantPool(cp.getFinalConstantPool()); return newClazz; }
What I do wrong?
I see such exception only on few classes (methods).
I have example of such class.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
