日志中指向类定义行的额外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
相关产品推荐
相关产品推荐

