You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日志中指向类定义行的额外StackTraceElement来源排查

异常堆栈中指向类定义行的栈帧来源疑问

我的日志中出现如下堆栈跟踪:

Aug 10, 2022 10:10:10 PM io.grpc.internal.SerializingExecutor run
SEVERE: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable@5703a7b7
java.lang.NullPointerException
    at MyProtoFile$MyProtoClass.<init>(MyProtoFile.java:20)
    at MyProtoFile$MyProtoClass.<init>(MyProtoFile.java:10)
    at MyProtoFile$MyProtoClass$1.parsePartialFrom(MyProtoFile.java:50)
    at MyProtoFile$MyProtoClass$1.parsePartialFrom(MyProtoFile.java:40)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:86)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:48)
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parseFrom(ProtoLiteUtils.java:223)
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:215)
    at io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller.parse(ProtoLiteUtils.java:118)
    at io.grpc.MethodDescriptor.parseRequest(MethodDescriptor.java:307)
    at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailableInternal(ServerCallImpl.java:318)
    at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.messagesAvailable(ServerCallImpl.java:301)
    at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1MessagesAvailable.runInContext(ServerImpl.java:834)
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)

查看对应生成代码时发现,MyProtoFile$MyProtoClass.<init>(MyProtoFile.java:10)、MyProtoFile$MyProtoClass$1.parsePartialFrom(MyProtoFile.java:40)以及com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:48)这些条目指向的是类定义的起始行(即public [static] class ClassName所在行)。

我无法提供MyProtoFile的Protobuf生成源码,但其他堆栈内容可在公开代码库中找到对应版本。

为了对比,我用原生Java 11运行了以下测试代码:

public class ConstructorStackTrace {

    public static class InnerClass {
        public InnerClass() {
            throw new NullPointerException("hello");
        }
    }

    public static void main(String []args){
        System.err.println("OneConstructor");
        try {
            OneConstructor constructorStackTrace = new OneConstructor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("NestedConstructor");
        try {
            NestedConstructor constructorStackTrace = new NestedConstructor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println("InnerClass");
        try {
            InnerClass constructorStackTrace = new InnerClass();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class OneConstructor {
    public  OneConstructor() {
        throw new NullPointerException("hello");
    }
}

class NestedConstructor {
    public NestedConstructor() {
        this("Hello");
    }

    public NestedConstructor(String hello) {
        throw new NullPointerException("hello");
    }
}

得到的堆栈跟踪中并无指向类定义行的元素:

OneConstructor
java.lang.NullPointerException: hello
        at OneConstructor.<init>(ConstructorStackTrace.java:33)
        at ConstructorStackTrace.main(ConstructorStackTrace.java:12)
NestedConstructor
java.lang.NullPointerException: hello
        at NestedConstructor.<init>(ConstructorStackTrace.java:43)
        at NestedConstructor.<init>(ConstructorStackTrace.java:39)
        at ConstructorStackTrace.main(ConstructorStackTrace.java:18)
InnerClass
java.lang.NullPointerException: hello
        at ConstructorStackTrace$InnerClass.<init>(ConstructorStackTrace.java:5)
        at ConstructorStackTrace.main(ConstructorStackTrace.java:24)

我其他日志里都没有这种情况,一开始以为是代码版本错误,但三个类都出现了相同模式,显然不是巧合。想知道这些额外的StackTraceElement来自何处?是gRPC插入的?还是gRPC日志格式导致的?


内容的提问来源于stack exchange,提问作者joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:15:42