SSpoke
SSpoke

Reputation: 5836

Java - how do you find out which class file has a corrupt constant pool?

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

Answers (2)

SSpoke
SSpoke

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

alphazero
alphazero

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

Related Questions