Go 런타임의 숨은 버그: 32비트 임베디드 시스템에서 5년 만에 발견
Hunting Down a Go Runtime Bug on 32-Bit Embedded Systems

고객의 32비트 ARM 임베디드 Linux 시스템에서 Go 애플리케이션이 간헐적으로 치명적인 netpoll 오류로 크래시되는 문제를 추적한 과정을 다룹니다. 원인은 Go 런타임의 netpoll 코드가 8바이트 epoll_event.data 필드에 원시 포인터와 태그된 포인터를 혼용하면서, 32비트 리틀 엔디언 시스템에서 fdseq 태그가 netpollEventFd 주소와 충돌하여 소켓 fd를 이벤트 fd로 오인한 것이었습니다. 이 버그는 Go 1.14(2020년)에서 도입되어 2026년에 수정되었으며, 장기 실행 프로그램에서만 수백만 개의 pollDesc 객체가 재활용된 후 발생합니다. 저자는 테스트 케이스와 수정 패치를 제공했고, 이 패치는 Go에 병합되었습니다.
이 버그는 2020년 Go 1.14에 들어왔고, 2025년 3월 첫 보고까지 발견되지 않았으며 2026년에야 수정되었습니다. 아마 Google 자체가 더 이상 32비트 Go 프로그램을 실행하지 않기 때문일 것입니다.
HN 토론
15- nasretdinov
Go는 64비트 시대에 태어났고, 32비트 시스템에서만 발생하는 버그를 훨씬 더 많이 본 기억이 납니다. 기사에서 언급된 관찰, 즉 Google에서는 아무도 64비트 ARM/x86 Linux 외에는 Go를 테스트하지 않는다는 것이 맞다고 확신합니다.
- dlopes7
매우 흥미로운 글입니다. 프로덕션에서 오랜 시간이 지난 후에야 발생하는 이런 버그들은 디버깅하기 가장 어렵죠.
- ReactiveJelly
그렇다면 Go와 Linux 사이의 경계에 더 강력한 타입 시스템이 있었다면 이 버그를 잡을 수 있었을까요?