-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Prints unsupported features before throwing a ParsingError #4661
Prints unsupported features before throwing a ParsingError #4661
Conversation
try { | ||
bb.getUnsupportedFeatures().report(bb); | ||
} catch (UnsupportedFeatureException uee) { | ||
System.err.println(uee.getMessage()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a logger I should/could use instead of err?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do you need your own handler here anyway? Wouldn't a surrounding catch (UnsupportedFeatureException)
take care of a thrown UnsupportedFeatureException
? cc @cstancu
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The UnsupportedFeatureException
is thrown by bb.getUnsupportedFeatures().report(bb)
which I only invoke when an exception is thrown by the bytecode parser. I am not sure I follow how a surrounding catch could take care of it, unless we through the UnsupportedFeatureException
instead of a ParsingError
which doesn't seem to me like the right thing to do.
Hi, Thank you for contributing to GraalVM, when this PR is ready for review, please let me know so that I can take care of it and assign it to the proper engineer. |
Hi @oubidar-Abderrahim , I have already asked @olpaw to have a look at this after the GraalVM release so I am assigning this to him (AFAIK he is on PTO so he will have a look when he gets back). |
Hi @olpaw , can you please have a look at this once you find some time. |
a9caa98
to
856e1bd
Compare
Parsing errors without the accompanying unsupported features might be misleading when using `link-at-build-time`. For instance if a Class `A` cannot be initialized because of a `NoClassDefFoundException` caused by a missing dependency, the exception and a corresponding message will be added to unsupported features and the Class `A` will be marked as `BUILD_TIME` initialized to allow the analysis to proceed and delay the error reporting. Later, while parsing bytecode an `UnresolvedElementException` may be thrown if the bytecode tries to instantiate the Class that was marked for `BUILD_TIME` initialization. Unfortunately at this point printing only the info regarding `UnresolvedElementException` makes it appear like the Class `A` methods are not reachable (because the Class is not initialized) while that's not actually true. Example of logs before this patch: ``` Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(java.lang.String) Parsing context: at net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(ExpressionLanguageRegistry.java:33) at net.sf.oval.expression.ExpressionLanguageRegistry.getExpressionLanguage(ExpressionLanguageRegistry.java:83) at net.sf.oval.AbstractCheck.isActive(AbstractCheck.java:151) at net.sf.oval.Validator.checkConstraint(Validator.java:763) at net.sf.oval.Validator._validateStaticInvariants(Validator.java:656) at net.sf.oval.Validator.validateInvariants(Validator.java:1382) at net.sf.oval.Validator.validate(Validator.java:1308) at gdv.xport.feld.Feld.validateInvariants(Feld.java:623) at gdv.xport.feld.Feld.validate(Feld.java:605) at gdv.xport.feld.AlphaNumFeld.validate(AlphaNumFeld.java:161) at gdv.xport.feld.Feld.validate(Feld.java:601) at gdv.xport.feld.Satznummer.validate(Satznummer.java:232) at gdv.xport.feld.Feld.isValid(Feld.java:583) at gdv.xport.feld.Feld.isInvalid(Feld.java:592) at gdv.xport.satz.Teildatensatz.getSatznummer(Teildatensatz.java:146) at gdv.xport.satz.Satz.importFrom(Satz.java:1063) at gdv.xport.Datenpaket.importNachsatzFrom(Datenpaket.java:482) at gdv.xport.Datenpaket.importSatz(Datenpaket.java:443) at gdv.xport.Datenpaket.importFrom(Datenpaket.java:420) at gdv.xport.Datenpaket.importFrom(Datenpaket.java:394) at de.knuspertante.MemberResource.hello(MemberResource.java:41) at de.knuspertante.MemberResource$quarkusrestinvoker$hello_e747664148511e1e5212d3e0f4b40d45c56ab8a1.invoke(Unknown Source) at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:117) at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:141) at [email protected]/java.lang.Shutdown.runHooks(Shutdown.java:130) at [email protected]/java.lang.Shutdown.shutdown(Shutdown.java:186) at app//com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:158) at app//com.oracle.svm.core.JavaMainWrapper.runShutdown0(JavaMainWrapper.java:197) at app//com.oracle.svm.core.JavaMainWrapper.runShutdown(JavaMainWrapper.java:184) at app//com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:219) at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0) at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:152) at com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:117) at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:84) at com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraph(MethodTypeFlow.java:66) at com.oracle.graal.pointsto.typestate.DefaultSpecialInvokeTypeFlow.onObservedUpdate(DefaultSpecialInvokeTypeFlow.java:61) at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:558) at com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:635) at com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:193) at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:177) at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved method during parsing: net.sf.oval.expression.ExpressionLanguageJEXLImpl.<init>(). This error is reported at image build time because class net.sf.oval.expression.ExpressionLanguageRegistry is registered for linking at image build time by command line. at parsing net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(ExpressionLanguageRegistry.java:58) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2506) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:105) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3367) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3319) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3164) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1138) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1030) at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:79) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:261) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38) at com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:135) at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:701) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:168) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:343) at com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:94) ... 13 more Caused by: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved method during parsing: net.sf.oval.expression.ExpressionLanguageJEXLImpl.<init>(). This error is reported at image build time because class net.sf.oval.expression.ExpressionLanguageRegistry is registered for linking at image build time by command line. at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.reportUnresolvedElement(SharedGraphBuilderPhase.java:298) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedMethod(SharedGraphBuilderPhase.java:288) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedInvoke(SharedGraphBuilderPhase.java:244) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeSpecial(BytecodeParser.java:1766) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeSpecial(BytecodeParser.java:1756) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5223) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3359) ... 28 more ``` and after this patch: ``` Class initialization of net.sf.oval.expression.ExpressionLanguageJEXLImpl failed. This error is reported at image build time because class net.sf.oval.expression.ExpressionLanguageJEXLImpl is registered for linking at image build time by command line. Use the option --initialize-at-run-time=net.sf.oval.expression.ExpressionLanguageJEXLImpl to explicitly request delayed initialization of this class. Detailed message: Original exception that caused the problem: java.lang.NoClassDefFoundError: org/apache/commons/jexl2/JexlContext at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method) at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1042) at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.ensureClassInitialized(ConfigurableClassInitialization.java:183) at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:653) at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.computeInitKindAndMaybeInitializeClass(ConfigurableClassInitialization.java:136) at com.oracle.svm.hosted.classinitialization.ConfigurableClassInitialization.shouldInitializeAtRuntime(ConfigurableClassInitialization.java:164) at com.oracle.svm.hosted.SVMHost.isInitialized(SVMHost.java:289) at com.oracle.graal.pointsto.meta.AnalysisType.isInitialized(AnalysisType.java:841) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.maybeEagerlyInitialize(BytecodeParser.java:4264) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4462) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4451) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genNewInstance(BytecodeParser.java:4446) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5227) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3359) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3319) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3164) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1138) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1030) at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:79) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:261) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38) at com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:135) at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:701) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:168) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:343) at com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:94) at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:84) at com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraph(MethodTypeFlow.java:66) at com.oracle.graal.pointsto.typestate.DefaultSpecialInvokeTypeFlow.onObservedUpdate(DefaultSpecialInvokeTypeFlow.java:61) at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:558) at com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:635) at com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:193) at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:177) at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) Caused by: java.lang.ClassNotFoundException: org.apache.commons.jexl2.JexlContext at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:476) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 42 more [2/7] Performing analysis... [*] (50.5s @ 1.85GB) 10,773 (90.20%) of 11,944 classes reachable 15,126 (58.82%) of 25,715 fields reachable Listening for transport dt_socket at address: 8000 53,400 (66.43%) of 80,381 methods reachable 418 classes, 9 fields, and 758 methods registered for reflection Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(java.lang.String) Parsing context: at net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(ExpressionLanguageRegistry.java:33) at net.sf.oval.expression.ExpressionLanguageRegistry.getExpressionLanguage(ExpressionLanguageRegistry.java:83) at net.sf.oval.AbstractCheck.isActive(AbstractCheck.java:151) at net.sf.oval.Validator.checkConstraint(Validator.java:763) at net.sf.oval.Validator._validateStaticInvariants(Validator.java:656) at net.sf.oval.Validator.validateInvariants(Validator.java:1382) at net.sf.oval.Validator.validate(Validator.java:1308) at gdv.xport.feld.Feld.validateInvariants(Feld.java:623) at gdv.xport.feld.Feld.validate(Feld.java:605) at gdv.xport.feld.AlphaNumFeld.validate(AlphaNumFeld.java:161) at gdv.xport.feld.Feld.validate(Feld.java:601) at gdv.xport.feld.Satznummer.validate(Satznummer.java:232) at gdv.xport.feld.Feld.isValid(Feld.java:583) at gdv.xport.feld.Feld.isInvalid(Feld.java:592) at gdv.xport.satz.Teildatensatz.getSatznummer(Teildatensatz.java:146) at gdv.xport.satz.Satz.importFrom(Satz.java:1063) at gdv.xport.Datenpaket.importNachsatzFrom(Datenpaket.java:482) at gdv.xport.Datenpaket.importSatz(Datenpaket.java:443) at gdv.xport.Datenpaket.importFrom(Datenpaket.java:420) at gdv.xport.Datenpaket.importFrom(Datenpaket.java:394) at de.knuspertante.MemberResource.hello(MemberResource.java:41) at de.knuspertante.MemberResource$quarkusrestinvoker$hello_e747664148511e1e5212d3e0f4b40d45c56ab8a1.invoke(Unknown Source) at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29) at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:117) at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:141) at [email protected]/java.lang.Shutdown.runHooks(Shutdown.java:130) at [email protected]/java.lang.Shutdown.shutdown(Shutdown.java:186) at app//com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:158) at app//com.oracle.svm.core.JavaMainWrapper.runShutdown0(JavaMainWrapper.java:197) at app//com.oracle.svm.core.JavaMainWrapper.runShutdown(JavaMainWrapper.java:184) at app//com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:219) at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0) at com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:152) at com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:117) at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:84) at com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraph(MethodTypeFlow.java:66) at com.oracle.graal.pointsto.typestate.DefaultSpecialInvokeTypeFlow.onObservedUpdate(DefaultSpecialInvokeTypeFlow.java:61) at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:558) at com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:635) at com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:193) at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:177) at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) Caused by: org.graalvm.compiler.java.BytecodeParser$BytecodeParserError: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved method during parsing: net.sf.oval.expression.ExpressionLanguageJEXLImpl.<init>(). This error is reported at image build time because class net.sf.oval.expression.ExpressionLanguageRegistry is registered for linking at image build time by command line. at parsing net.sf.oval.expression.ExpressionLanguageRegistry._initializeDefaultEL(ExpressionLanguageRegistry.java:58) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.throwParserError(BytecodeParser.java:2506) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.throwParserError(SharedGraphBuilderPhase.java:105) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3367) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.handleBytecodeBlock(BytecodeParser.java:3319) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3164) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:1138) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1030) at jdk.internal.vm.compiler/org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:84) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:79) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.run(Phase.java:49) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:261) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:42) at jdk.internal.vm.compiler/org.graalvm.compiler.phases.Phase.apply(Phase.java:38) at com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:135) at com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:701) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:168) at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:343) at com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:94) ... 13 more Caused by: com.oracle.graal.pointsto.constraints.UnresolvedElementException: Discovered unresolved method during parsing: net.sf.oval.expression.ExpressionLanguageJEXLImpl.<init>(). This error is reported at image build time because class net.sf.oval.expression.ExpressionLanguageRegistry is registered for linking at image build time by command line. at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.reportUnresolvedElement(SharedGraphBuilderPhase.java:298) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedMethod(SharedGraphBuilderPhase.java:288) at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.handleUnresolvedInvoke(SharedGraphBuilderPhase.java:244) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeSpecial(BytecodeParser.java:1766) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.genInvokeSpecial(BytecodeParser.java:1756) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:5223) at jdk.internal.vm.compiler/org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3359) ... 28 more ```
856e1bd
to
3e68a61
Compare
Hello @olpaw , could you please have a look at this draft PR and provide feedback? |
@zakkak please provide a simple reproducer that leads to the suboptimal error reporting that this patch is fixing. |
Disclaimer: It's not minimal, but it's clear what's going on.
You can use This will result (tested with
Looking at the dependencies of the project, however, we see that With this PR we get some additional info indicating what caused this missleading exception:
It's far from perfect though... |
Hi @olpaw, this is a kind reminder for providing some feedback. |
FWIW this is still reproducible with c8fd386 |
#6245 should fix this problem by properly recording |
Parsing errors without the accompanying unsupported features might be
misleading when using
link-at-build-time
. For instance if a ClassA
cannot be initialized because of a
NoClassDefFoundException
caused bya missing dependency, the exception and a corresponding message will be
added to unsupported features and the Class
A
will be marked asBUILD_TIME
initialized to allow the analysis to proceed and delay theerror reporting. Later, while parsing bytecode an
UnresolvedElementException
may be thrown if the bytecode tries toinstantiate the Class that was marked for
BUILD_TIME
initialization. Unfortunately at this point printing only the info
regarding
UnresolvedElementException
makes it appear like the ClassA
methods are not reachable (because the Class is not initialized)while that's not actually true.
Example of logs before this patch:
and after this patch: