RFR: 8295537: Debug tracing for resolved java.lang.invoke.CallSite [v2]

Ioi Lam iklam at openjdk.org
Wed Oct 26 05:18:46 UTC 2022


On Tue, 25 Oct 2022 19:46:15 GMT, Jorn Vernee <jvernee at openjdk.org> wrote:

>>> Is it possible to use filter/findfirst without using lambdas? I want to avoid recursion inside the tracing code.
>> 
>> You could do this I believe (if I've eye-balled that correctly :)):
>> Suggestion:
>> 
>>         String callerName = caller.getName();
>>         String callerInfo = StackWalker.getInstance().walk(new Function<Stream<StackWalker.StackFrame>, String>() {
>>             // We use inner classes (instead of stream/lambda) to avoid triggering
>>             // further invokedynamic resolution, which would cause infinite recursion.
>>             // It's OK to use + for string concat, because java.base is compiled without
>>             // the use of indy string concat.
>>             @Override
>>             public String apply(Stream<StackWalker.StackFrame> s) {
>>                 return s.filter(new Predicate<StackWalker.StackFrame>() {
>>                     @Override
>>                     public boolean test(StackWalker.StackFrame f) {
>>                         return callerName.equals(f.getClassName());
>>                     }
>>                 }).findFirst().get().toStackTraceElement().toString();
>>             }
>>         });
>> 
>> 
>>> I am not sure about dumping the call stack. It seems an overkill and not useful in most cases. It’s easier to rebuild the JDK and add Thread.dumpStack() in the rare occasion that you need to do this.
>> 
>> Fair enough.
>
> Or, maybe it's easier to use `Thread.currentThread().getStackTrace()` and avoid messing around with streams altogether.

I ended up using `Thread.currentThread().getStackTrace()` and the code is much cleaner. Performance isn't important anyway. `Stream.filter()` doesn't work because it uses a Lambda in `<clinit>`:


java.lang.NullPointerException: Cannot invoke "java.util.stream.TerminalOp.getOpFlags()" because "terminalOp" is null
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
        at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:328)
        at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:315)
        at java.base/java.lang.StackStreamFactory$StackFrameTraverser.consumeFrames(StackStreamFactory.java:586)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.doStackWalk(StackStreamFactory.java:324)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:410)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walkHelper(StackStreamFactory.java:261)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:253)
        at java.base/java.lang.StackWalker.walk(StackWalker.java:589)
        at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteTracing(MethodHandleNatives.java:315)
        at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:275)
        at java.base/java.util.stream.FindOps$FindSink$OfRef.<clinit>(FindOps.java:198)
        at java.base/java.util.stream.FindOps.makeRef(FindOps.java:60)
        at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
        at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:328)
        at java.base/java.lang.invoke.MethodHandleNatives$1.apply(MethodHandleNatives.java:315)
        at java.base/java.lang.StackStreamFactory$StackFrameTraverser.consumeFrames(StackStreamFactory.java:586)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.doStackWalk(StackStreamFactory.java:324)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.callStackWalk(Native Method)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.beginStackWalk(StackStreamFactory.java:410)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walkHelper(StackStreamFactory.java:261)
        at java.base/java.lang.StackStreamFactory$AbstractStackWalker.walk(StackStreamFactory.java:253)
        at java.base/java.lang.StackWalker.walk(StackWalker.java:589)
        at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteTracing(MethodHandleNatives.java:315)
        at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:275)
        at java.base/jdk.internal.module.SystemModuleFinders$1.find(SystemModuleFinders.java:216)
        at java.base/jdk.internal.module.ModuleBootstrap.boot2(ModuleBootstrap.java:260)
        at java.base/jdk.internal.module.ModuleBootstrap.boot(ModuleBootstrap.java:174)
        at java.base/java.lang.System.initPhase2(System.java:2214)

-------------

PR: https://git.openjdk.org/jdk/pull/10842


More information about the core-libs-dev mailing list