ACCESS_VIOLATION_BAD_IP

Я пытаюсь выяснить сбой в моем приложении. WinDbg сообщает мне следующее: (используя тире вместо подчеркивания)


ПОСЛЕДНИЙ ПЕРЕДАЧА КОНТРОЛЯ: с 005f5c7e на 6e697474
DEFAULT-BUCKET-ID: BAD_IP
BUGCHECK-STR: НАРУШЕНИЕ ДОСТУПА

Для меня очевидно, что 6e697474 НЕ является действительным адресом.

У меня три вопроса:
1) Означает ли идентификатор корзины "BAD_IP" "Указатель неверной инструкции?"
2) Это многопоточное приложение, поэтому одно соображение заключалось в том, что объект, функцию которого я пытался вызвать, вышел за пределы области видимости. Кто-нибудь знает, приведет ли это к тому же сообщению об ошибке?
3) Что еще может вызвать такую ​​ошибку? Один из моих коллег предположил, что это может быть проблема переполнение стека, но WinDBG в прошлом оказался довольно надежным в обнаружении и указании на них. (не то чтобы я уверен насчет вуду, которое он делает в фоновом режиме, чтобы диагностировать это).

Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
0
0
1 034
3

Ответы 3

Bad-IP - это указатель неверной инструкции. Из описания вашей проблемы я бы предположил, что это повреждение стека, а не переполнение стека.

Я могу думать о следующих вещах, которые могут вызвать переход к недопустимому адресу в порядке убывания вероятности:

  • вызов функции-члена для освобожденного объекта. (как вы подозреваете)
  • вызов функции-члена поврежденного объекта.
  • вызов функции-члена объекта с поврежденной таблицей vtable.
  • указатель румян, перезаписывающий пространство кода.

Я бы начал отладку, найдя код в 005f5c7e и посмотрев, к каким объектам там обращаются.

Может быть полезно спросить, что могло записать строку «ttie» в это место? Часто, когда у вас есть байты в диапазоне 0x41-0x5A, 0x61-0x7A ([a-zA-Z]), это указывает на переполнение строкового буфера.

Что касается того, что было фактически перезаписано, это может быть адрес возврата, какой-либо другой указатель на функцию, который вы используете, или иногда указатель таблицы виртуальных функций (vfptr) в объекте был перезаписан, чтобы указать на середину строки.

Другие вопросы по теме