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

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

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

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

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

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

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


person Community    schedule 27.01.2009    source источник
comment
Вы можете найти свой ответ здесь, там должна быть функция поиска ошибки, которая поможет вам найти проблему   -  person Filip Ekberg    schedule 27.01.2009


Ответы (6)


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

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

person Peter McMinn    schedule 27.01.2009
comment
Ба! Били у линии ворот ;-) - person Vegar; 28.01.2009
comment
Отличное предложение, хотя мне интересно, работает ли оно в этом случае. Это приложение VB6, и только элемент управления ActiveX, используемый в приложении, написан на Delphi. - person Lars Truijens; 28.01.2009
comment
Судя по грубой схеме сообщения об ошибке, это не похоже на часть VB6, которая вызывает ошибку. Парень в моем офисе, который занимается VB6, говорит, что создать эту ошибку довольно сложно (но не невозможно). В любом случае, я думаю, что всегда лучше попытаться поймать / обработать как можно больше. - person Peter McMinn; 29.01.2009

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

Разумеется, это очень сильно тебе поможет ...

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

person Vegar    schedule 27.01.2009
comment
еврикалог сам глючит :) за мадши - person Z80; 16.08.2018

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

person Stu Mackellar    schedule 27.01.2009
comment
что делать, если я получаю AV, но программа не вылетает (поэтому нет файла dmp)? - person Z80; 16.08.2018

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

person lsalamon    schedule 27.01.2009

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

person rbrayb    schedule 27.01.2009
comment
и как их использовать? - person Z80; 16.08.2018

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

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