我试图使用WinDbg调试C / C ++ Win32 DLL,但目前它无法加载访问冲突。这是日志中已编辑的代码段:
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的倍数:)
为什么会发生?在哪里看?
答案 0 :(得分:2)
“第一次机会异常”通常是正常的,通常可以忽略不计。
如果你在调试器中继续程序 - 不仅仅是下一条指令,而是让它再次运行;我认为这是WinDbg中的'g'命令 - 它是否有效或是否因另一个异常(不是是“第一次机会异常”)而崩溃?
(如果你得到另一个“第一次机会异常”,那么你也可以忽略它;这意味着第一个异常已由异常处理程序处理,现在你看到一个完全不同的异常可以处理同样。)
某些代码使用(或者说滥用)正常流控制的异常,因此很难在调试器下运行该代码,该调试器在抛出异常时立即设置为中断。您可以将调试器配置为仅在未处理异常时中断。
另一方面,如果继续执行该程序确实会导致未处理的异常,那么您可能在代码中遇到了一个错误(可能是由调试器触发的竞争条件改变了某些事情的运行速度或者它们的顺序碰巧运行),或者你没有像往常一样在同一个上下文中运行程序(例如当前目录,DLL路径,环境变量或其他一些东西是不同的)。或者你正在使用的DLL明确地检查调试器以试图阻止人们对其进行逆向工程(但这种情况非常罕见)。