Еще одна подсказка (в дополнение к ответу Оли ) при поиске ошибок памяти с помощью отладчика gdb
заключается в отключении рандомизации макета адресного пространства , например,
echo 0 > /proc/sys/kernel/randomize_va_space
После этого два последовательных запуска одной и той же детерминированной программы обычно будут mmap
областей с одинаковыми адресами (от одного запуска к другому), и это очень помогает при отладке с помощью gdb
(потому что тогда malloc
обычно дает один и тот же результат от одного прогона к другому, в том же заданном месте в прогоне).
Вы также можете использовать команду watch
gdb
.В частности, если при первом запуске (с отключенной ASLR) вы полагаете, что расположение 0x123456 неожиданно меняется, вы можете дать gdb
следующую команду при втором запуске:
watch * (void**) 0x123456
Затем gdb
сломается, когда это местоположение изменится (к сожалению, оно должно быть уже mmap
).