[jboss-jira] [JBoss JIRA] Updated: (JASSIST-99) Javassist causes java.lang.ClassFormatError: Invalid length 561 in LocalVariableTable in class file
Martin Burger (JIRA)
jira-events at lists.jboss.org
Mon Nov 23 07:47:30 EST 2009
[ https://jira.jboss.org/jira/browse/JASSIST-99?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Martin Burger updated JASSIST-99:
---------------------------------
Attachment: JASSIST-99.zip
The attached archive JASSIST-99.zip contains both the working and the corrupt class flle.
> Javassist causes java.lang.ClassFormatError: Invalid length 561 in LocalVariableTable in class file
> ---------------------------------------------------------------------------------------------------
>
> Key: JASSIST-99
> URL: https://jira.jboss.org/jira/browse/JASSIST-99
> Project: Javassist
> Issue Type: Bug
> Affects Versions: 3.11.0.GA
> Reporter: Martin Burger
> Assignee: Shigeru Chiba
> Attachments: JASSIST-99.zip
>
>
> I am instrumenting field accesses in Java classes. Unfortunately, this fails in some cases, the manipulated byte code causes a java.lang.ClassFormatError:
> Exception in thread "main" java.lang.ClassFormatError: Invalid length 561 in LocalVariableTable in class file de/unisb/cs/st/deltadebugging/jinsi/test/integration/events/outgoing/fieldaccesses/SuperClassOfObserved
> at java.lang.ClassLoader.defineClass1(Native Method)
> ...
> This issue occurred in 3.11.0.GA and is not fixed in r505. Maybe this is related to JASSIST-98. In 3.10.0.GA, this issue does not exist, the affected class can be loaded without any error.
> I tried to analyze the corrupt class file with javassist.tools.framedump, but the analysis fails:
> Exception in thread "main" java.lang.RuntimeException: javassist.bytecode.BadBytecode: Could not find class in descriptor [pos = 8]: de.unisb.cs.st.deltadebugging.jinsi.test.integration.events.outgoing.fieldaccesses.Unobserved
> at javassist.bytecode.analysis.FramePrinter.print(FramePrinter.java:89)
> ...
> I decompiled both classes (the working one and the corrupt one) using JAD, the output differs slightly:
> 43c43
> < /* 16*/ JVM INSTR new #96 <Class Long>;
> ---
> > /* 16*/ JVM INSTR new #102 <Class Long>;
> 59c59
> < /* 16*/ JVM INSTR new #96 <Class Long>;
> ---
> > /* 16*/ JVM INSTR new #102 <Class Long>;
> Here is the corrupt decompiled code of line 16. Compared to the working class, lines 43 and 59 seem to be switched:
> 28 /* 16*/ obj = this;
> 29 /* 16*/ Unobserved unobserved1 = null;
> 30 /* 16*/ unobserved1 = ((SuperClassOfObserved) (obj)).unobserved;
> 31 /* 16*/ EventRecorderFactory.getInstance().recordOutgoingFieldRead(this, JinsiClassUtils.getClassOfObject(this), obj, Desc.getClazz("de.unisb.cs.st.deltadebugging.jinsi.test.integration.events.outgoing.fieldaccesses.SuperClassOfObserved"), "unobserved", unobserved1, Desc.getType("Lde/unisb/cs/st/deltadebugging/jinsi/test/integration/events/outgoing/fieldaccesses/Unobserved;"), "SuperClassOfObserved.java", 16, Context.METHOD);
> 32 /* 16*/ EventRecorderFactory.getInstance().recordIncomingFieldRead(this, JinsiClassUtils.getClassOfObject(this), obj, Desc.getClazz("de.unisb.cs.st.deltadebugging.jinsi.test.integration.events.outgoing.fieldaccesses.SuperClassOfObserved"), "unobserved", unobserved1, Desc.getType("Lde/unisb/cs/st/deltadebugging/jinsi/test/integration/events/outgoing/fieldaccesses/Unobserved;"), "SuperClassOfObserved.java", 16, Context.METHOD);
> 33 /* 16*/ obj = unobserved1;
> 34 /* 16*/ l = 0L;
> 35 /* 16*/ l = ((Unobserved) (obj)).fieldLong;
> 36 /* 16*/ EventRecorderFactory.getInstance();
> 37 /* 16*/ this;
> 38 /* 16*/ JinsiClassUtils.getClassOfObject(this);
> 39 /* 16*/ obj;
> 40 /* 16*/ Desc.getClazz("de.unisb.cs.st.deltadebugging.jinsi.test.integration.events.outgoing.fieldaccesses.Unobserved");
> 41 /* 16*/ "fieldLong";
> 42 /* 16*/ l;
> 43 /* 16*/ JVM INSTR new #102 <Class Long>;
> 44 /* 16*/ JVM INSTR dup ;
> 45 /* 16*/ Long();
> 46 /* 16*/ Desc.getType("J");
> 47 /* 16*/ "SuperClassOfObserved.java";
> 48 /* 16*/ 16;
> 49 /* 16*/ Context.METHOD;
> 50 /* 16*/ recordOutgoingFieldRead();
> 51 /* 16*/ JVM INSTR pop ;
> 52 /* 16*/ EventRecorderFactory.getInstance();
> 53 /* 16*/ this;
> 54 /* 16*/ JinsiClassUtils.getClassOfObject(this);
> 55 /* 16*/ obj;
> 56 /* 16*/ Desc.getClazz("de.unisb.cs.st.deltadebugging.jinsi.test.integration.events.outgoing.fieldaccesses.Unobserved");
> 57 /* 16*/ "fieldLong";
> 58 /* 16*/ l;
> 59 /* 16*/ JVM INSTR new #102 <Class Long>;
> 60 /* 16*/ JVM INSTR dup ;
> 61 /* 16*/ Long();
> 62 /* 16*/ Desc.getType("J");
> 63 /* 16*/ "SuperClassOfObserved.java";
> 64 /* 16*/ 16;
> 65 /* 16*/ Context.METHOD;
> 66 /* 16*/ recordIncomingFieldRead();
> 67 /* 16*/ JVM INSTR pop ;
> 68 /* 16*/ long fieldLong = l;
> However, I don't know if this is related to the defect.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list