Нарушение прав доступа при загрузке DLL под отладчиком - PullRequest
0 голосов
/ 24 декабря 2010

Я пытаюсь отладить C32 / C ++ Win32 DLL с WinDbg, но в данный момент она не загружается с нарушением прав доступа. Вот отредактированный фрагмент из журнала:

ModLoad: 77bd0000 77bd7000   C:\WINDOWS\system32\midimap.dll
ModLoad: ...\PyFM.fmx       <-- THIS IS MY DLL
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for
    ...\FMWrapper.dll - 
ModLoad: ...\FMWrapper.dll   <-- THIS IS ANOTHER DLL I LINK AGAINST
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for
    C:\WINDOWS\WinSxS\x86_Microsoft.VC90.
    DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\MSVCR90D.dll - 
ModLoad: 10200000 10323000  C:\WINDOWS\WinSxS\x86_Microsoft.VC90.
    DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\MSVCR90D.dll
(564.970): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=05e79b68 ecx=b79a0c61 edx=0049e000 esi=05e79c0c edi=00000080
eip=02887094 esp=0012fa0c ebp=00120000 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
DBEngine!Draco::DBPlugIn::MakeCall+0x94:
02887094 c745fcffffffff  
    mov     dword ptr [ebp-4],0FFFFFFFFh ss:0023:0011fffc=????????

Стек в этот момент выглядит так (WinDbg предупреждает, что информация может быть неточной):

DBEngine!Draco::DBPlugIn::MakeCall+0x94
DBEngine!Draco::DBPlugIn::LoadStringW+0x7e

Если я попытаюсь продолжить шаг за шагом (хотя я не понимаю инструкции ассемблера), я вижу, что управление передается ntdll; например следующая инструкция такова:

ntdll!KiUserExceptionDispatcher+0x4:
7c90e480 8b1c24
    mov     ebx,dword ptr [esp]  ss:0023:0012f71c=0012f724

То, что я пытался: немного, потому что я не понимаю, что происходит. Первоначально я получил эту ошибку при не отладочной сборке DLL; затем я попытался использовать отладочную версию, но ошибка не исчезла. Я подозревал манифесты и немного читал о них, но в этой части нет ничего плохого; Я даже проверил, что размер файла манифеста кратен 4 :)

Почему это могло случиться? Где мне искать?

1 Ответ

2 голосов
/ 24 декабря 2010

«Исключения первого шанса» часто бывают нормальными и их часто можно игнорировать.

Если вы продолжаете программу в отладчике - не просто следующую инструкцию, но заставляете ее выполняться снова;Я думаю, что это команда 'g' в WinDbg - она ​​работает или аварийно завершает работу с другим исключением (которое не «исключение первого шанса»)?

(Есливы получаете еще одно «исключение первого шанса», тогда вы также можете его игнорировать, это будет означать, что обработчик исключений обработал первое исключение, и теперь вы видите совершенно другое исключение, которое также может быть обработано.)

Некоторые коды используют (или, скорее, злоупотребляют) исключениями для обычного управления потоком данных, что затрудняет запуск этого кода в отладчике, который настроен на прерывание при возникновении исключения.Вместо этого вы можете настроить отладчик так, чтобы он прерывался только тогда, когда исключение не обрабатывается.

С другой стороны, если продолжение программы приведет к необработанному исключению, вы, вероятно, получили ошибку в коде (возможно, состояние гонки, которое вызывается отладчиком, изменяющим скорость выполнения определенных задач или порядок их выполнения), или вы не запускаете программу в том же контексте, что и обычно (например, текущий каталог, путь к DLL, средапеременные или что-то другое отличается).Или, может быть, DLL, которую вы используете явно проверяет отладчик, чтобы попытаться остановить людей, обращающихся к нему (но это очень редко).

...