Проблема с ошибочными программами заключается в том, что их поведение не определено. Иногда они работают, а в другое время непредсказуемо.
И Valgrind, и GDB влияют на время выполнения программы и могут скрывать условия гонки (что может случиться как для многопоточных, так и для многопроцессорных программ).
Кроме того, GDB отключает рандомизацию адресного пространства, делая адреса в программе повторяемыми от запуска к запуску. Обычно это то, что вам нужно при отладке, но ваш сбой может проявиться только для определенной случайной компоновки разделяемых библиотек, и эта компоновка может никогда не произойти в GDB.
Лучше всего включить генерацию дампов ядра (ulimit -c unlimited
), запустить программу за пределами GDB и отменить ее (сбой assert
вызывает abort
). Получив ядро, отладьте его с помощью GDB: gdb /path/to/your/executable core
.
Для описанных вами проблем Valgrind обычно является лучшим инструментом. Если задействовано несколько процессов, вам нужно запустить valgrind с флагом --trace-children=yes
.