热门搜索:  小三

荡寇风云

OpenAI 将崩溃调试视为流行病学研究,修复了存在 18 年之久的 GNU libunwind 漏洞_我的网站

金陵十三钗

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

B |     K图 300607_0  8月24日晚间,拓斯达发布《关于对外投资的公告》,公司拟以自有资金或自筹资金1.47亿元,通过受让武汉来勒光电科技有限公司(下简称来勒光电)原股东所持部分股权的方式,取得来勒光电合计49%的股权。

C | 这个 Bug 似乎根本不可能存在。本次交易完成后,来勒光电将成为公司参股企业。

D |   公告显示,公司当日召开第五届董事会第三次会议,审议通过了《关于对外投资的议案》。

E |   1.47亿元受让49%股权切入光通信赛道   根据公告,拓斯达此次拟受让的股权来自来勒光电原股东张朋勇、郭欢欢及武汉来勒企业管理咨询合伙企业(有限合伙)(下简称武汉来勒)。  交易前,张朋勇持有来勒光电60%股权,武汉来勒持有30%,郭欢欢持有10%;交易完成后,拓斯达将持有来勒光电49%股权,张朋勇降至36%,武汉来勒降至15%,郭欢欢退出。         他们原本以为是一个 Bug ,结果却发现是两个互不相关的 Bug ,它们只是很巧合地在同一时间被发现了。图片来源:公告截图  来勒光电成立于2015年,总部位于湖北武汉,是国家高新技术企业。这一突破性发现并非来自对单个崩溃事件的深入排查,而是源于转向了他们所说的“流行病学调试”:构建一条管道,自动分析过去一年中生产环境的每一个核心转储文件,然后寻找整体规律,而不是对单个案例进行推断。         该团队让 ChatGPT 编写了一个脚本,用于下载每个核心文件的开头部分,提取寄存器数据,过滤已知的误报,并将每次崩溃标记为“返回空指针”、“栈对齐错误”或其他类型。他们将该脚本并行应用于过去一年中的所有 Rockset 核心转储文件。其聚焦光模块高精度耦合设备,是光通信领域的高端设备制造商。产品涵盖双透镜自动耦合系统、双FA自动耦合系统、激光器自动耦合系统、芯片自动测试系统等。他们很快就发现了相关性。原本从症状上看属于同类的问题,实际上对应两组特征完全不同的崩溃事件。

F |   财务数据显示,截至2026年6月30日,来勒光电资产总额5034.82万元,净资产889.78万元;2026年上半年实现营业收入1822.34万元,净利润321.42万元。

G | 图片来源:公告截图  公告还披露了一项值得关注的安排:在协议签署且收购方首次信息披露后的6个月内,出售方承诺在二级市场购买上市公司拓斯达A股股票,合计购买总金额不低于3000万元。

H |   对于本次投资的目的,拓斯达表示,本次投资来勒光电对公司的业务布局和产业协同具有促进作用,可以进一步完善公司在智能制造装备领域布局,助力公司切入高景气光通信赛道。  公司认为,AI技术加速迭代推动数据中心流量高速增长,算力扩容拉动高速光模块需求,光模块厂商产线投资或产线升级规模持续走高,光模块设备迎来增长周期。         这些因栈对齐错误导致的崩溃均源自同一个 Azure 区域,有明确的起始日期,而且从未出现在长期运行的节点上。

I | 团队追踪发现,这些崩溃源自一台物理主机,其 CPU 正在悄无声息地产生错误的结果。  公司工业机器人及自动化应用系统可以与来勒光电耦合设备叠加,形成差异化解决方案,并可借助来勒光电优质光模块客户资源,实现工业机器人及自动化应用系统向光通信高端制造场景导入。它既没有过热,也没有抛出机器检查异常,而只是数学运算默默出了错。  上半年净利大增263%   拓斯达主营业务为工业机器人及自动化应用系统、注塑装备、数控机床,下游主要为3C、汽车、家电等行业。将该主机从服务中移除后,因栈对齐错误导致的崩溃便完全消失了。         在剔除硬件崩溃问题后,剩余的由“返回空指针”导致的崩溃问题便变得可控了。  公司此前发布的2026年半年度报告显示,2026年上半年公司实现营业收入12.88亿元,同比增长18.61%;归母净利润为1.04亿元,同比增长262.99%;扣非后净利润为8669.12万元,同比增长324.37%。此前,团队曾排除了 C++ 异常展开的原因,因为他们认为自己找到了反例:在未使用异常的代码路径中发生了崩溃。但这些反例全都来自有硬件损坏的故障集群。一旦剔除了这些干扰因素,剩余的所有崩溃便都是发生在异常展开过程中了。         问题发生的根本原因是 GNU libunwind 的 _Ux86_64_setcontext 函数中有一个已经存在 18 年的竞争条件。图片来源:公告截图  分业务看,工业机器人及自动化应用系统业务实现营业收入7.07亿元,同比增长121.62%,是公司收入增长的主要引擎;数控机床业务实现营业收入2.09亿元,同比增长27.60%;注塑装备业务实现营业收入2.58亿元,同比增长12.86%。

J | 在 C++ 异常展开过程中,libunwind 会在栈上合成一个 ucontext_t 结构体,填充所需的寄存器状态,然后调用 _Ux86_64_setcontext 将控制权转移给清理处理程序。公司表示,收入增长主要系三大主营板块收入规模不同程度增长,而低毛利率的智能能源及环境管理系统业务规模同比减少79.61%,收入结构明显改善。问题在于:_Ux86_64_setcontext 在从旧结构体中读取指令指针的操作尚未完成之前,就将栈指针(%rsp)更新为指向新的栈帧。  在具身智能领域,公司持续推进布局,其人形机器人“小拓”是中国首款应用于注塑场景的具身智能机器人,四足机器人"星仔"可用于自主巡检及复杂环境专项作业。一旦 %rsp 发生变化,该结构体便不再属于活动栈的一部分,也不再受内核红区的保护。

K | 公司已构建起“场景+机器人+数据+AI”的商业闭环。如果信号恰好在 %rsp 更新与 %rip 读取之间的这一时间窗口内到达,内核就会在该结构体之上构建其信号帧,指令指针遭到破坏,函数便会跳转到 NULL 或垃圾地址。(文章来源:每日经济新闻)。         竞争窗口的宽度正好为一条指令。以现代处理器的时钟频率计算,这大约相当于 100 皮秒。在大多数程序中,这种情况根本不会被触发。OpenAI 的 Rockset 使用了 timer_create 函数,每隔几毫秒的 CPU 时间就发送一次 SIGUSR2 信号,为的是实现轻量级的按查询记账,这样产生的信号发送事件远多于传统的应用程序。正是这种高频的信号发送,将只在理论上可能发生的竞争状况转化成了实际生产环境中的崩溃。         该团队将一个修复方案和一个自包含的重现示例提交到了 GNU libunwind,并通过验证证实,其他展开器(如 libgcc)不存在这个问题。该修复方案通过重新排序指令,确保在更新 %rsp 之前先读取 %rip,从而彻底消除了这个时间窗口。         该团队对这一教训的总结值得全文引用:          最重要的步骤并非巧妙地解读汇编代码,也不是对细节的深入了解,而是构建一个高质量的数据集。

L | 如果没有这个数据集,我们就会把两种截然不同的现象混为一谈,并试图通过推理来理清这种混乱。一旦获得了准确且完整的全量数据,问题的结构便显而易见了。         如果你的团队正在排查难以解释的生产环境崩溃问题,请检查你们是否将多个 Bug 混为一谈。那些看似与所有假设都不相符的症状,实际上可能并不矛盾;它们可能与两个不同的假设相符,而你却无意中将它们混淆了。洞察问题结构的最快途径,并非对单个案例进行更深入的分析,而是获取涵盖所有故障案例的完整、带标签的数据。         这篇完整的工程技术博文包含了详细的栈内存示意图、存在漏洞的汇编指令,以及揭示出两种不同类型故障的崩溃率可视化图表。

M |          https://www.infoq.com/news/2026/07/openai-libunwind-core-dumps/          声明:本文由 InfoQ 翻译,未经许可禁止转载。

Current article:http://5d5s0.chuandanfozhuanbenglipaicuzi.pics/uxyux9q/g6v34r3.html

Published on:01:50:43