Посмотрите на разборку.Практически любой отладчик C / C ++ будет рад показать вам машинный код и регистры, в которых произошел сбой программы.Регистры включают в себя указатель инструкций (EIP или RIP на x86 / x64), где находилась программа, когда она остановилась.Другие регистры обычно имеют адреса памяти или данные.Если адрес памяти равен 0 или неверный указатель, это ваша проблема.
Тогда вам просто нужно работать задом наперед, чтобы выяснить, как это получилось.Аппаратные точки останова при изменениях памяти очень полезны здесь.
На Linux / BSD / Mac использование скриптовых функций GDB может очень помочь здесь.Вы можете написать сценарий так, чтобы после того, как точка останова была достигнута 20 раз, она включила аппаратное наблюдение за адресом элемента массива 17. И т. Д.
Вы также можете записать отладку в свою программу.Используйте функцию assert ().Везде!
Используйте assert для проверки аргументов каждой функции.Используйте assert для проверки состояния каждого объекта перед выходом из функции.В игре утверждают, что игрок находится на карте, что у игрока есть здоровье от 0 до 100, утверждают все, что вы можете придумать.Для сложных объектов пишите функции verify () или validate () в сам объект, который проверяет все о нем, а затем вызывает их из assert ().
Другой способ записи в отладке - использовать сигнал использования программы.() в Linux или asm int 3 в Windows, чтобы взломать отладчик из программы.Затем вы можете написать временный код в программу, чтобы проверить, находится ли он на итерации 1117321 основного цикла.Это может быть полезно, если ошибка всегда происходит в 1117322. Программа будет выполняться намного быстрее, чем при использовании точки останова отладчика.