Трапилася непроста ситуація. Є код, написаний на С, який активно використовується через cgo в проекті, написаному на Go. У якийсь момент програма почала падати з помилками від malloc: то segfault, то memory corruption.

Логічна думка: потрібен valgrind з його memcheck, щоб перевірити, хто лізе поперек батька в пекло невалидную пам'ять. Однак, спроба згодувати валгринду бінарники, отриманий від go build, призведе тільки до розчарування — навіть на простому Hello World валгринд вибухне сотнями помилок і відправить розробника на відомі координати (спойлер: "Go fix your program!").

Це відбувається з-за того, що go runtime досить специфічний і значно відрізняється від такого в С. (Подробиці можна спокійно знайти за запитом «golang valgrind»).

Так як же нам розібратися, що відбувається?

Читати далі →