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日

18:27
过去几年,AI进入教育领域后,最先落地的场景是“解题”。 学生拍照上传一道题,AI快速生成答案、步骤和解析。这类产品解决了学习中的即时需求,也推动了教育AI的普及。 但随着AI应用深入,一个问题逐渐显现:知道答案,并不等于真正理解。 尤其在数学学习中,很多困难并不是不会计算,而是不理解公式背后的逻辑。函数为什么变化? 几何...
18:27
最近一段时间,二级市场AI 板块跌宕起伏,芯片、存储、光互联轮番震荡。Meta 又上调了 2026 年资本开支预期,把 AI 基建到底还要投多久、投多快,重新拉回了讨论中心。 钱还在往算力、存储和数据中心里涌,市场已经开始问:AI 基建是不是到了阶段性高点?这轮热潮还能跑多久?与此同时,具身智能、世界模型、Agent、Token,以及从云到...
18:27
“百模大战”降温后,大厂之间新一轮AI入口大战战火正燃,而这一轮,集中体现在智能体入口之争。 7月21日,据《财经》报道,阿里将推出千问办公。它已经整合QoderWork、悟空、MuleRun这三款智能体(Agent)产品。千问办公将是阿里面向Agent办公市场的拳头产品。与此同时,时代周报记者从知情人士处获悉,腾讯已发布内部通知,整合Wo...
18:27
五年亏掉356亿元后,商汤把新故事讲到了太空。 在近日世界人工智能大会的一场论坛上,商汤一口气抛出多项AI基础设施计划:年内联合国星宇航发射4颗算力卫星,未来两年建设5个万卡级国产算力集群,继续扩建上海临港算力中心,并把国产算力中心铺到香港和海外。 其中最吸睛的,当然是算力卫星。 当地面上的AI公司还在为芯片、电力和数据中心发愁时,...
18:27
以谷歌、亚马逊、微软、Meta、甲骨文五家企业为代表的超大规模云服务商 “19世纪淘金热时期,资金提供者吃了亏,而卖铲子等提供基础设施的人却积累了最多的财富。AI革命也在上演同样的戏码”。谷歌、亚马逊等超大规模云服务商的股价基本持平…… 被称为“超大规模云服务商(Hyperscaler)”的大型云服务企业的股价上涨乏力。它...
18:27
用公司配发的电脑,在办公软件里密谋偷老东家的路线图,还敲下一句“LOL”——这起大概是史上最没技术含量的泄密案,刚刚被苹果抓了现行。几十名 OpenAI 员工收到了法律保全通知。 这桩荒唐的官司背后,其实是 OpenAI 越来越孤立的处境。马斯克、Anthropic 创始人 Dario,暗讽他们拿走用户数据的最大金主微软,再加上现在的苹果。...
18:27
近期,包括艺妙神州、景泽生物、汇禾医疗、艾柯医疗、术锐机器人在内的多家大健康企业纷纷开启IPO进程。鼓狮财经获悉,世和基因的科创板上市申请也已于6月29日获上交所受理,并于7月21日步入首轮问询环节,由华泰联合证券担任保荐人。值得注意的是,这并非世和基因首次闯关科创板。2022年5月,世和基因科创板IPO获受理。2024年4月,因世和基因及其保荐人撤回发行上...
18:22
鼓狮财经7月22日讯本周三,有媒体报道称,据传韩国存储巨头SK海力士正在与英特尔谈判,拟收购英特尔位于俄亥俄州的半导体园区,目标是在五年内开始在那里生产存储芯片。 但SK海力士和英特尔随后均否认了这一消息。 SK海力士发言人表示,该公司并未寻求或决定要收购英特尔公司位于俄亥俄州的半导体。而行业人士也分析称,这一传言极不可能属实。 两家公司双双否认 此前,韩国...
18:00
鼓狮财经7月22日电,中润光学(688307.SH)公告称,预计2026年半年度归属于母公司所有者的净利润为3000万元-3500万元,同比增长45.88%-70.20%。业绩变动主要系公司原有光学镜头业务快速增长,高清拍摄及显示、智能移动机器感知等板块增长较快,以及戴斯光电纳入合并报表范围,带动收入及业绩提升。
18:00
鼓狮财经7月22日电,昂利康(002940.SZ)公告称,公司拟以自有资金5000万元分三期增资晟睿康生物医药(杭州)有限责任公司,合计取得晟睿康36.4706%股权,并将获得晟睿康研发产品在大中华区域的优先合作权。
18:00
鼓狮财经7月22日电,紫光股份(000938.SZ)公告称,公司股票连续三个交易日内(2026年7月20日、21日、22日)收盘价格涨幅偏离值累计超过20%,属于股票交易异常波动。经自查,公司前期披露信息无需更正,未发现未公开重大信息,经营环境未发生重大变化。公司于2026年7月11日披露半年度业绩预告,预计净利润为19.1亿元至23.2亿元,同比增长83....
18:00
鼓狮财经7月22日电,云意电气(300304.SZ)公告称,公司拟使用自有或自筹资金3000万欧元,在比利时投资设立全资子公司,以搭建欧洲本地化配套服务体系,完善海外市场布局。该事项已获董事会审议通过,无需提交股东会审议。