Как узнать, кто вызывает ошибку нарушения прав доступа?

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

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

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

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

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

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

Ответ 1

Мое предложение состояло бы в том, чтобы попробовать либо ссылку MadExcept , либо ссылку Eurekalog текст. Они фиксируют необработанное исключение и создают дамп стека в точке, где возникает проблема.

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

Ответ 2

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

Теперь вам нужна помощь сейчас, от курса...

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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