2008-09-24 3 views
0

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


LAST-CONTROL-ПЕРЕДАЧА: от 005f5c7e до 6e697474
DEFAULT-роторных ID: BAD_IP
BugCheck-STR: ДОСТУПА НАРУШЕНИЕ

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

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

ответ

2

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

0

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

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

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

0

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

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