Случилась непростая ситуация. Есть код, написанный на С, который активно используется через cgo в проекте, написанном на Go. В какой-то момент программа начала падать с ошибками от malloc: то segfault, то memory corruption.
Логичная мысль: нужен valgrind с его memcheck, чтобы проверить, кто лезет поперёк батьки в пекло в невалидную память. Однако, попытка скормить валгринду бинарник, полученный от go build, приведёт только к разочарованию — даже на простом Hello World валгринд разразится сотнями ошибок и отправит разработчика на известные координаты (спойлер: "Go fix your program!").
Это происходит из-за того, что go runtime довольно специфичен и значительно отличается от такового в С. (Подробности можно спокойно найти по запросу «golang valgrind»).
Так как же нам разобраться, что происходит?
Читать полностью »