tshark -r grpc.pcap -Y 'http2.data.data' -T fields -e http2.data.data
xxd -r -p body.hex > body.bin
protoc --decode_raw < body.bin

线上偶发解析失败,tcpdump 抓下来的包里 body 是一串不可打印字符,Wireshark 只标了 HTTP2 DATA 帧,看不到字段名和值。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:gRPC 的 body 是 protobuf 二进制,字段名在编译期就丢了,报文里只剩编号、wire type 和长度。没有 .proto 描述符,任何工具都只能按字节猜。

这次卡住的地方就在「Protobuf 报文还原」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

处理上按这个顺序:先用 tcpdump 只抓目标端口 存成 pcap 别在终端里看;在 Wireshark 里 Follow HTTP/2 Stream 导出 DATA 帧的原始字节;用 protoc --decode_raw 先看编号和类型 再拿 .proto 做带字段名的解码;确认是哪个字段异常后 再回到代码里查赋值。

确认没问题再收工,decode_raw 的输出里能看到出错的字段编号和长度 和代码里的赋值对得上。

作者 9823189