Go 런타임의 숨은 버그: 32비트 임베디드 시스템에서 5년 만에 발견

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

Go 런타임의 숨은 버그: 32비트 임베디드 시스템에서 5년 만에 발견

고객의 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 프로그램을 실행하지 않기 때문일 것입니다.
  1. nasretdinov

    Go는 64비트 시대에 태어났고, 32비트 시스템에서만 발생하는 버그를 훨씬 더 많이 본 기억이 납니다. 기사에서 언급된 관찰, 즉 Google에서는 아무도 64비트 ARM/x86 Linux 외에는 Go를 테스트하지 않는다는 것이 맞다고 확신합니다.

  2. dlopes7

    매우 흥미로운 글입니다. 프로덕션에서 오랜 시간이 지난 후에야 발생하는 이런 버그들은 디버깅하기 가장 어렵죠.

  3. ReactiveJelly

    그렇다면 Go와 Linux 사이의 경계에 더 강력한 타입 시스템이 있었다면 이 버그를 잡을 수 있었을까요?

이 날의 다른 글

2026-08-29