Я просто потратил некоторое время на поиски ошибки, которая сводилась к следующему. Код ошибочно перезаписывал стек, и я думаю, что он записал поверх адреса возврата вызова функции. После возврата программа зависнет и стек будет поврежден. Запуск программы в valgrind вернет ошибку, такую как:
vex x86->IR: unhandled instruction bytes: 0xEA 0x3 0x0 0x0
==9222== valgrind: Unrecognised instruction at address 0x4e925a8.
Я полагаю, это потому, что возвращение переместилось в случайное место, содержащее вещи, которые не были действительными кодами операций x86. (Хотя я почему-то подозреваю, что этот адрес 0x4e925a8 оказался на исполняемой странице. Я полагаю, что valgrind выдаст другую ошибку, если это не так.)
Я уверен, что проблема была в типе перезаписи стека, и с тех пор я исправил его. Сейчас я пытаюсь подумать, как можно более эффективно отлавливать подобные ошибки. Очевидно, что valgrind не может предупредить меня, если я перезаписываю data в стеке, но, возможно, он может перехватить, когда кто-то переписывает адрес возврата в стеке. В принципе, он может обнаружить, когда происходит что-то вроде «push EIP» (поэтому он может указать, где находятся адреса возврата в стеке).
Мне было интересно, кто-нибудь знает, может ли это сделать Вальгринд или еще кто-нибудь? Если нет, можете ли вы прокомментировать другие предложения относительно ошибок отладки этого типа.