Как узнать, кто вызывает ошибку нарушения доступа? - PullRequest
11 голосов
/ 27 января 2009

Я получаю сообщения о том, что мое приложение вызывает GPF на некоторых компьютерах Vista. Сообщение об ошибке выглядит примерно так:

нарушение доступа в 0x75784062 (попытка записи в 0x00000006)

Чтобы это исправить, мне сначала нужно точно знать, кто вызывает этот GPF: мой основной exe, какой-то сторонний компонент, один из моих компонентов activex, dll и т. Д.

Как я могу это выяснить? Какими инструментами можно точно определить модуль, вызвавший этот беспорядок?

Любая помощь будет принята с благодарностью.

PS Мое приложение написано на VB6, а мои элементы управления ActiveX написаны на Delphi 2007.

Ответы [ 6 ]

10 голосов
/ 28 января 2009

Я бы хотел попробовать MadExcept текст ссылки или Eurekalog текст ссылки . Они захватывают необработанное исключение и создают дамп стека в точке, где возникает проблема.

Нет ссылки на них, кроме как как довольный клиент. MadExcept позволил мне отследить и устранить некоторые очень редкие проблемы в моих программах.

3 голосов
/ 28 января 2009

Я бы порекомендовал какой-то хук Exception-hook, например Eurekalog или madExcept , который дает хороший вызов при возникновении исключений.

Теперь это желание вам очень поможет, конечно ...

Мне не повезло с диалоговым окном «Найти ошибку». Вообще, последовательный неудачный случай и большое количество шагов - единственное / самое быстрое / простое решение. Если это неинициализированный указатель или освобожденный объект, FastMM4 может помочь вам с правильными настройками.

1 голос
/ 27 января 2009

Установите Отладьте Diag и следите за своим приложением, он сгенерирует для вас файл DUMP и проанализирует.

1 голос
/ 27 января 2009

При сбое программы Windows должна сохранить аварийный дамп . Затем вы можете загрузить это в WinDbg или, в крайнем случае, в Visual Studio. Существуют различные способы анализа дампа, чтобы выяснить, что пошло не так. Для начала:

0 голосов
/ 21 мая 2010

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

  1. Посмотри на адрес. DLL (включая ActiveX / OCX), загружаются в более высоком адрес, обычно за 0x50000000 (системные библиотеки DLL обычно находятся в От 0x70000000 до 0x78000000). Похоже, ваш AV происходит в DLL. Помните, что в последней версии Windows рандомизация загрузки адресного пространства может изменять адреса при каждом запуске
  2. Стек вызовов очень полезен для понимания того, как код попал в AV. Помимо EurekaLog и MadExcept, библиотеки JCL / JVCL полезны для получения этой информации. Вам может понадобиться скомпилировать больше отладочной информации (и файлов карт), чтобы получить полезный стек вызовов.
  3. В Delphi имеется функция отладки адресов Goto, которая позволяет загрузить приложение, приостановить его в отладчике и затем перейти к адресу. Но это требует, чтобы адрес не менялся между тем (перекомпиляция с модификацией, вероятно, изменит адрес, и рандомизация тоже подойдет).
  4. Если ошибка не воспроизводится на компьютере разработчика, вы можете попробовать удаленный отладчик для отладки приложения, запущенного на другом компьютере.
0 голосов
/ 27 января 2009

Вы можете использовать Process Monitor или Process Explorer, оба с сайта SysInternals .

...