Reputation: 5836
Is there some kind of a tool or some better output from javac
to figure out which class file has a corrupt constant pool.. as I cannot compile some existing java files due to some pre-compiled file has a corrupt constant pool..
Here is how a corrupt constant pool stack print out looks like
An exception has occurred in the compiler (1.6.0_26). Please file a bug at the J
ava Developer Connection (http://java.sun.com/webapps/bugreport) after checking
the Bug Parade for duplicates. Include your program and the following diagnosti
c in your report. Thank you.
java.lang.ArrayIndexOutOfBoundsException: 8047705
at com.sun.tools.javac.jvm.ClassReader.nextInt(ClassReader.java:277)
at com.sun.tools.javac.jvm.ClassReader.skipMember(ClassReader.java:1504)
at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1559)
at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:16
58)
at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1845)
at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
at com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:1951)
at com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:842)
at com.sun.tools.javac.comp.Resolve.findIdentInPackage(Resolve.java:1011
)
at com.sun.tools.javac.comp.Attr.selectSym(Attr.java:1921)
at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1835)
at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522
)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
at com.sun.tools.javac.comp.Attr.attribType(Attr.java:390)
at com.sun.tools.javac.comp.MemberEnter.attribImportType(MemberEnter.jav
a:681)
at com.sun.tools.javac.comp.MemberEnter.visitImport(MemberEnter.java:545
)
at com.sun.tools.javac.tree.JCTree$JCImport.accept(JCTree.java:495)
at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:399
)
at com.sun.tools.javac.comp.MemberEnter.visitTopLevel(MemberEnter.java:5
12)
at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:
446)
at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:819)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
at com.sun.tools.javac.comp.Enter.complete(Enter.java:464)
at com.sun.tools.javac.main.JavaCompiler.complete(JavaCompiler.java:659)
at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1869)
at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
at com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:1951)
at com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:842)
at com.sun.tools.javac.comp.Resolve.findGlobalType(Resolve.java:901)
at com.sun.tools.javac.comp.Resolve.findType(Resolve.java:957)
at com.sun.tools.javac.comp.Resolve.findIdent(Resolve.java:986)
at com.sun.tools.javac.comp.Resolve.resolveIdent(Resolve.java:1162)
at com.sun.tools.javac.comp.Attr.visitIdent(Attr.java:1714)
at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:1547)
at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
at com.sun.tools.javac.comp.Attr.attribType(Attr.java:390)
at com.sun.tools.javac.comp.MemberEnter.signature(MemberEnter.java:355)
at com.sun.tools.javac.comp.MemberEnter.visitMethodDef(MemberEnter.java:
560)
at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:639)
at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:399
)
at com.sun.tools.javac.comp.MemberEnter.finishClass(MemberEnter.java:410
)
at com.sun.tools.javac.comp.MemberEnter.finish(MemberEnter.java:1000)
at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:967)
at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)
at com.sun.tools.javac.comp.Enter.complete(Enter.java:464)
at com.sun.tools.javac.comp.Enter.main(Enter.java:442)
at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:81
9)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
at com.sun.tools.javac.main.Main.compile(Main.java:353)
at com.sun.tools.javac.main.Main.compile(Main.java:279)
at com.sun.tools.javac.main.Main.compile(Main.java:270)
at com.sun.tools.javac.Main.compile(Main.java:69)
at com.sun.tools.javac.Main.main(Main.java:54)
Upvotes: 2
Views: 3590
Reputation: 5836
Kinda fixed, found out a good quickfix.. just add -verbose
to your javac
parameters and you'll see like..
[parsing started .\a.java]
[parsing completed 0ms]
[loading .\ajava]
[parsing started .\b.java]
[parsing completed 0ms]
[loading .\bingo\foo.class] //<- here we go.. just before exception.
An exception has occurred in the compiler (1.6.0_26). Please file a bug at the J
ava Developer Connection (http://java.sun.com/webapps/bugreport) after checking
the Bug Parade for duplicates. Include your program and the following diagnosti
c in your report. Thank you.
Upvotes: 3
Reputation: 27234
I suggest you instrument the compiler with aspectj. You just need to trap that precise stack signatures and dump the params passed to each method. Your class name is gonna be in that dump.
edit:
e.g. com.sun.tools.javac.jvm.ClassReader.readClassFile
Upvotes: 0