原始笔记是一篇”事故记录 + 心得”,这里把”现象 / 思路 / 插曲”分节整理,原文细节都保留。
当前保留内容
1. 现象
升级到 gcc12 后,编译选项中加上 -O2,遇到 protobuf 的 required 字段:
mutable_*返回的指针不为空;- 紧跟着调用
set_*之后,字段读出来却没有值。
2. 解决思路
按”先复现、后定位”的顺序尝试了两条路:
- 镜像回滚到 gcc82:代码按照 gcc82 编译,发现仍然不通过(依赖库一并回滚后也复现不出来),说明问题不仅仅是编译器版本本身。
- 对比编译选项差异:把 gcc82 / gcc12 两套构建用到的编译选项逐项对齐、对比,从中找出真正影响行为的那一项。
3. 解决方案插曲:大佬让我加日志
时间线很有意思,也很值得记下来:
大佬,让我加日志!
18:46 大佬让我加日志。
19:16 我才想明白,为啥让我加日志,怎么加日志?!
大佬的潜台词:
怀疑是某个字段设置问题导致的,set_* 失败!
所以要"更精细"的日志——按字段一项项打出来,看到底哪个 set 没生效。
大佬的一句话 == 我的 30 分钟。

后续可补的方向
这篇后续如果继续整理,建议至少补下面几类内容:
- 最终定位到的根因和具体修复方法(编译选项 / protobuf 版本 / 代码本身)
- 一份 gcc8 → gcc12 升级后值得提前 review 的兼容性 checklist
- “如何加日志”这件事本身的方法论:粒度、字段级 dump、对照实验等
当前这篇先当作一个”事故复盘 + 方法论提醒”的占位条目。
FEATURED TAGS
Git
Cheat Sheet
Markdown
Tools
C++
Linker
Thread
Linux
TCP
Network
GDB
Debug
leetcode
链表
WSL
Ubuntu
Windows
Linux Kernel
GCC
Android
adb
Troubleshooting
Profiling
Sanitizer
glibc
MySQL
Database
Python
curl
Build
ELF
clang-format
CMake
Graphviz
Performance
vcpkg
Protobuf
排查
速查
内存
STL
调试
性能分析
性能
读书笔记
方法论
架构
网络
Timer
mbedTLS
TLS
安全
负载均衡
脚本
工具
LRU
二叉树
BST
中序遍历
回溯
二分查找
优先队列
排序
旋转数组
jenkins
部署