精选昨天0 投票
核心转储流行病学:修复一个18年的老Bug
核心转储流行病学:修复一个18年的老Bug
OpenAI 的工程师最近通过大规模核心转储(core dump)分析,成功定位并修复了其数据基础设施中两个看似不可能的错误——其中一个竟然是来自底层库 GNU libunwind 中潜伏了 18年 的竞态条件。
奇怪的崩溃现象
故事始于 OpenAI 的 Rockset 服务(ChatGPT 数据基础设施的关键组件)出现一系列崩溃。崩溃表现为:一个正常的 C++ 函数执行完毕后,返回到一个无效地址,导致程序被内核终止。有时返回地址是 NULL,有时栈指针寄存器 %rsp 莫名其妙地偏移了 8 字节。这些异常模式在常规应用代码中几乎不可能出现。
团队尝试了所有常规调试手段,甚至借助 ChatGPT 分析,但每个假设都被证据推翻。这个 Bug 看起来“不可能”。
流行病学方法
传统调试依赖对少数核心转储的深入检查,但面对这种罕见且诡异的崩溃,团队改变了策略——像流行病学家一样思考。他们收集了所有崩溃的核心转储,构建了一个高质量的全量数据集,从统计模式中寻找线索。
通过大规模分析,他们发现崩溃其实源于两个完全独立的问题,只是恰好在同一时间被发现:
- 硬件故障:某个 Azure 主机上的 CPU 存在静默计算错误,导致指令执行异常。
- 软件 Bug:GNU libunwind 中一个存在了 18 年的竞态条件。该库用于栈回溯,在特定并发场景下会破坏栈帧,导致返回地址被覆盖。
修复与启示
硬件问题通过更换主机解决;软件 Bug 则提交了补丁给上游社区。这个案例展示了大规模崩溃数据分析在定位极低概率 Bug 上的威力——当单点检查失效时,全量统计能揭示隐藏的规律。
OpenAI 的工程师强调,随着 AI 系统对底层基础设施依赖加深,C++ 的内存安全问题与硬件可靠性将成为持续挑战。而“核心转储流行病学”这种跨领域方法,或许会成为未来大型系统调试的标配。



