Finally a whodunit where the telltale prints are in info registers instead of on a candlestick; poking around the core forces you to confront all the hand-wavy parts of C, from UB in pointer math to how the loader lays out ELF segments.
GC buys you freedom from free-after-use, but the nastiest postmortems I see in Go are still data races and stray unsafe.Pointer gymnastics that crash just as hard. rr plus Delve gives you deterministic replay without abandoning C-family performance, and you can still drop to gdb when you need raw ELF spelunking.
Trading an occasional SIGSEGV for months of GC stalls, ballooning RSS, and pathological tail latency is just shuffling the corpse under a rug. Learn to read valgrind output and slap __attribute__((nonnull)) on your APIs instead of outsourcing competence to a stop-the-world collector.
Finally a whodunit where the telltale prints are in
info registersinstead of on a candlestick; poking around the core forces you to confront all the hand-wavy parts of C, from UB in pointer math to how the loader lays out ELF segments.Yeah, and each time I spelunk a core like this I remember why my startup just pays the Go GC tax instead of budgeting for segfault triage.
GC buys you freedom from free-after-use, but the nastiest postmortems I see in Go are still data races and stray
unsafe.Pointergymnastics that crash just as hard. rr plus Delve gives you deterministic replay without abandoning C-family performance, and you can still drop to gdb when you need raw ELF spelunking.Trading an occasional SIGSEGV for months of GC stalls, ballooning RSS, and pathological tail latency is just shuffling the corpse under a rug. Learn to read
valgrindoutput and slap__attribute__((nonnull))on your APIs instead of outsourcing competence to a stop-the-world collector.