Как узнать, кто вызывает ошибку нарушения прав доступа?
Я получаю сообщения о том, что мое приложение вызывает 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, которая позволяет загружать приложение, приостанавливать его в отладчике и затем переходить на адрес. Но для этого требуется, чтобы адрес не изменялся (перекомпиляция с изменением, вероятно, изменит адрес, и рандомизация тоже будет работать).
- Если ошибка не реплицируется на вашей машине разработки, вы можете попробовать удаленный отладчик для отладки приложения, запущенного на другой машине.