【发布时间】:2011-07-19 11:20:00
【问题描述】:
普通的 C 应用程序在 MSVC6 上可以正常编译,但在运行时会引发访问冲突。
在 WinDbg 中运行应用程序时,加载 rasadhlp.dll(Windows 文件)时出现 AV 错误。
问题:在加载 windows dll 时,什么可能导致访问冲突?
我习惯于使用各种 nixes 而不是 windows,所以我可能缺少一些非常明显的东西。
[...]
ModLoad: 77920000 77a13000 C:\WINDOWS\system32\SETUPAPI.dll
ModLoad: 76fc0000 76fc6000 C:\WINDOWS\system32\rasadhlp.dll
(f38.a08): 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=00000000 ecx=00000000 edx=0049f8f0 esi=0049f8f0 edi=00000000
eip=7c918fea esp=0012fbdc ebp=0012fc50 iopl=0 nv up ei ng nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286
ntdll!RtlpWaitForCriticalSection+0x5b:
7c918fea ff4010 inc dword ptr [eax+10h] ds:0023:00000010=????????
0:000> g
(f38.a08): Access violation - code c0000005 (!!! second chance !!!)
eax=00000000 ebx=00000000 ecx=00000000 edx=0049f8f0 esi=0049f8f0 edi=00000000
eip=7c918fea esp=0012fbdc ebp=0012fc50 iopl=0 nv up ei ng nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000286
ntdll!RtlpWaitForCriticalSection+0x5b:
7c918fea ff4010 inc dword ptr [eax+10h] ds:0023:00000010=????????
注意:该应用程序在win2k上编译,在XP上测试。 (由于各种奇怪的原因,现在无法更改...)
[编辑]:程序跟踪:
ntdll!RtlpWaitForCriticalSection+0x5b
ntdll!RtlEnterCriticalSection+0x46
msvcrt!vprintf+0x18
intl!libintl_vfprintf+0xa8
intl!libintl_fprintf+0x1f
image00400000+0x6239
MSCTF!DllGetClassObject+0x1de9
ntdll!RtlpNtMakeTemporaryKey+0x7ec8
ntdll!RtlInitializeSListHead+0x115c0
ntdll!iswdigit+0x339
ntdll!LdrGetProcedureAddress+0x4b
image00400000+0x626f4
[edit 2]:我知道异常首先被调试器捕获,这是完全正常的。您会在日志中注意到我手动跳过了第一次机会异常,并强制它进入我的程序。我想知道这种错误的根源,而不是处理方式。
【问题讨论】:
-
你能跟踪你的程序的执行吗?崩溃是否发生在进入 main 之前?
-
另外,您是使用静态运行时还是动态运行时编译程序?
-
我偷偷怀疑您正在混合运行时的两个版本,这可能会导致一些有趣的问题。您应该尝试针对静态运行时编译程序
-
嘿哈斯图昆。这听起来很合理。我认为这是静态链接,但由于这是继承代码,让我确定...
-
这是环境问题,堆栈跟踪肯定不会指向您的代码。 msctf.dll 是一个危险信号,进入控制面板+区域和语言选项并禁用语言栏。或者让机器从第四层的窗户滑出。
标签: c windows visual-c++ dll access-violation