Go 在 32 位嵌入式系统上的隐晦运行时 Bug

Hunting Down a Go Runtime Bug on 32-Bit Embedded Systems

Go 在 32 位嵌入式系统上的隐晦运行时 Bug

我们在调试一个长期运行的 Go 应用程序时,发现它在 32 位 ARM 嵌入式 Linux 系统上会随机崩溃,报错指向 netpoll 机制。深入分析后,我们发现这是 Go 运行时在 32 位小端系统上的一个设计缺陷:当程序运行时间足够长,生成的 fdseq 计数值会与 netpollEventFd 的内存地址发生别名冲突,导致 socket fd 被误判为 event fd。这个自 Go 1.14 版本起就存在的 Bug,直到 2025 年才被报告,我们最终通过修改指针存储方式修复了它。

这个 Bug 自 2020 年的 Go 1.14 版本起就潜伏在运行时中,直到 2025 年 3 月才首次被报告,最终在 2026 年得到修复。

同日更多故事

2026-08-29