OpenAI 的工程师们花了数周时间,试图解释 Rockset 中那些神秘的崩溃问题。Rockset 是一款 C++ 数据基础设施服务,为 ChatGPT 的搜索和数据插件提供支持。函数似乎会返回错误的内存地址,栈指针在执行过程中似乎会偏移 8 个字节。团队提出的每一种假设都面临着有力的反证。这个 Bug 似乎根本不可能存在。

他们原本以为是一个 Bug ,结果却发现是两个互不相关的 Bug ,它们只是很巧合地在同一时间被发现了。这一突破性发现并非来自对单个崩溃事件的深入排查,而是源于转向了他们所说的“流行病学调试”:构建一条管道,自动分析过去一年中生产环境的每一个核心转储文件,然后寻找整体规律,而不是对单个案例进行推断。

该团队让 ChatGPT 编写了一个脚本,用于下载每个核心文件的开头部分,提取寄存器数据,过滤已知的误报,并将每次崩溃标记为“返回空指针”、“栈对齐错误”或其他类型。他们将该脚本并行应用于过去一年中的所有 Rockset 核心转储文件。他们很快就发现了相关性。原本从症状上看属于同类的问题,实际上对应两组特征完全不同的崩溃事件。

这些因栈对齐错误导致的崩溃均源自同一个 Azure 区域,有明确的起始日期,而且从未出现在长期运行的节点上。团队追踪发现,这些崩溃源自一台物理主机,其 CPU 正在悄无声息地产生错误的结果。它既没有过热,也没有抛出机器检查异常,而只是数学运算默默出了错。将该主机从服务中移除后,因栈对齐错误导致的崩溃便完全消失了。

在剔除硬件崩溃问题后,剩余的由“返回空指针”导致的崩溃问题便变得可控了。此前,团队曾排除了 C++ 异常展开的原因,因为他们认为自己找到了反例:在未使用异常的代码路径中发生了崩溃。但这些反例全都来自有硬件损坏的故障集群。一旦剔除了这些干扰因素,剩余的所有崩溃便都是发生在异常展开过程中了。

问题发生的根本原因是 GNU libunwind 的 _Ux86_64_setcontext 函数中有一个已经存在 18 年的竞争条件。在 C++ 异常展开过程中,libunwind 会在栈上合成一个 ucontext_t 结构体,填充所需的寄存器状态,然后调用 _Ux86_64_setcontext 将控制权转移给清理处理程序。问题在于:_Ux86_64_setcontext 在从旧结构体中读取指令指针的操作尚未完成之前,就将栈指针(%rsp)更新为指向新的栈帧。一旦 %rsp 发生变化,该结构体便不再属于活动栈的一部分,也不再受内核红区的保护。如果信号恰好在 %rsp 更新与 %rip 读取之间的这一时间窗口内到达,内核就会在该结构体之上构建其信号帧,指令指针遭到破坏,函数便会跳转到 NULL 或垃圾地址。

竞争窗口的宽度正好为一条指令。以现代处理器的时钟频率计算,这大约相当于 100 皮秒。在大多数程序中,这种情况根本不会被触发。OpenAI 的 Rockset 使用了 timer_create 函数,每隔几毫秒的 CPU 时间就发送一次 SIGUSR2 信号,为的是实现轻量级的按查询记账,这样产生的信号发送事件远多于传统的应用程序。正是这种高频的信号发送,将只在理论上可能发生的竞争状况转化成了实际生产环境中的崩溃。

该团队将一个修复方案和一个自包含的重现示例提交到了 GNU libunwind,并通过验证证实,其他展开器(如 libgcc)不存在这个问题。该修复方案通过重新排序指令,确保在更新 %rsp 之前先读取 %rip,从而彻底消除了这个时间窗口。

该团队对这一教训的总结值得全文引用:

最重要的步骤并非巧妙地解读汇编代码,也不是对细节的深入了解,而是构建一个高质量的数据集。如果没有这个数据集,我们就会把两种截然不同的现象混为一谈,并试图通过推理来理清这种混乱。一旦获得了准确且完整的全量数据,问题的结构便显而易见了。

如果你的团队正在排查难以解释的生产环境崩溃问题,请检查你们是否将多个 Bug 混为了一谈。那些看似与所有假设都不相符的症状,实际上可能并不矛盾;它们可能与两个不同的假设相符,而你却无意中将它们混淆了。洞察问题结构的最快途径,并非对单个案例进行更深入的分析,而是获取涵盖所有故障案例的完整、带标签的数据。

这篇完整的工程技术博文包含了详细的栈内存示意图、存在漏洞的汇编指令,以及揭示出两种不同类型故障的崩溃率可视化图表。

原文链接:https://www.infoq.com/news/2026/07/openai-libunwind-core-dumps/

最新快讯

2026年07月22日

17:30
鼓狮财经7月22日电,动力新科(600841.SH)公告称,公司收到控股股东上汽集团出具的承诺函,基于对公司未来发展前景的信心及内在投资价值的认可,上汽集团承诺自2026年7月22日起6个月内,不以任何方式减持其持有的公司股份(包括因资本公积转增股本、派送股票红利等取得的新增股份)。截至目前,上汽集团持有公司股份5.39亿股,占总股本的38.86%。
17:30
鼓狮财经7月22日电,云南能投(002053.SZ)公告称,公司获得龙陵县段家坝风电场项目开发权。该项目已列入云南省2025年第二批新能源项目开发建设清单,预计总装机容量80MW,建设总工期12个月。项目实施尚需获得政府核准及相关审批,存在不确定性。
17:29
鼓狮财经7月22日电,华菱钢铁(000932.SZ)公告称,7月21日,控股股东湖南钢铁集团取得中国建设银行股份有限公司湖南省分行营业部出具的《湖南钢铁集团有限公司股票增持专项贷款承诺函》,该行承诺同意向湖南钢铁集团提供最高额不超过2亿元的股票增持专项贷款,贷款期限不超过3年。
17:29
鼓狮财经7月22日电,在菲律宾马尼拉出席东盟外长会的俄罗斯外长拉夫罗夫表示,他将于23日与美国国务卿鲁比奥会面,并希望了解美方目前在乌克兰问题上的立场。
17:29
鼓狮财经7月22日电,德国国防部长鲍里斯·皮斯托里乌斯21日说,在德国汽车产业面临压力背景下,他支持德国车企生产军工产品。对于这类“转向”能否产生效果,也有人提出质疑。皮斯托里乌斯当天参观德法合资军工企业KNDS防御系统公司在德国的一家工厂时表示,德国汽车产业正面临困难,而军工产业对劳动力和生产设施“需求巨大”,前者调整生产方向将使两个产业“都受益”。KND...
17:18
鼓狮财经7月22日讯因三星电子、SK海力士计划将龙仁晶圆厂竣工时间提前,韩国政府相应调整龙仁半导体集群的电力、供水等配套基建规划,其中国家产业园区的电力供应目标达成时间将提前超10年。 政府护航 韩国气候能源环境部部长金星焕于今日视察了位于京畿道龙仁市处仁区的半导体集群,实地考察电力与供水基础设施的建设进度及供应保障措施。 金星焕部长表示: “抢抓半导体投...
17:15
鼓狮财经7月22日讯谷歌母公司Alphabet将在美股周三盘后公布第二季度财报,其被视为判断人工智能交易发展的一个重要参考。投资者仍在消化各大巨头为人工智能平台建设数据中心和芯片投入的巨额资金,并开始对投资人工智能公司保持谨慎。 分析师预计,Alphabet第二季度营收将进一步增长到1168亿美元,同比增长21.1%,与第一季度的增速21.8%基本持平。谷歌...
16:57
鼓狮财经7月22日电,交运股份(600676.SH)公告称,公司证券简称自2026年7月28日起由“交运股份”变更为“久事动娱”,证券代码“600676”保持不变。公司已完成资产置换,置入文体娱乐业与旅游业核心业务,转型为全国综合性文体旅交产业集团。
16:57
鼓狮财经7月22日电,华强科技(688151.SH)公告称,预计2026年半年度归属于母公司所有者的净利润为850万元到1067万元,同比增长105.65%到158.15%。业绩变动主要系公司优化医药包装产品结构,加大市场开拓,产品销量及收入增加,同时提质增效行动取得实效。小财注:公司Q2净利润预计0.02亿-0.04亿,Q1净利润0.06亿,据此计算,Q2...
16:57
鼓狮财经7月22日电,中国西电(601179.SH)公告称,公司下属14家子公司为国家电网2026年特高压项目第三次设备及输变电项目第三次变电设备招标采购中标人,中标金额合计约41.29亿元。其中,特高压项目中标金额26.32亿元,输变电项目中标金额14.97亿元。相关项目签约后将对公司未来经营产生积极影响,但尚未签署正式合同,存在不确定性。
16:57
鼓狮财经7月22日电,国电电力(600795.SH)公告称,经初步统计,2026年上半年,公司合并报表口径完成发电量2189.11亿千瓦时,上网电量2078.75亿千瓦时,较上年同期分别增长6.25%和6.17%;参与市场化交易电量占上网电量的94.2%;平均上网电价393.31元/千千瓦时。2026年二季度,公司合并报表口径完成发电量1129.27亿千瓦时...