我在现场看到了drwtsn32生成的崩溃转储,它表明调用系统API FreeLibrary时该应用程序已被阻止。
这是类堆栈:

ChildEBP RetAddr  Args to Child
06f0fc14 7c827d29 7c83d266 00000718 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
06f0fc18 7c83d266 00000718 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0])
06f0fc54 7c83d2b1 00000718 00000004 00000000 ntdll!RtlpWaitOnCriticalSection+0x1a3 (FPO: [2,7,4])
06f0fc74 7c839874 7c8897a0 00000000 00000000 ntdll!RtlEnterCriticalSection+0xa8 (FPO: [1,1,0])
06f0fd7c 77e6b1bb 014e0000 00000000 02a67430 ntdll!LdrUnloadDll+0x35 (FPO: [SEH])
06f0fd90 005e8cdd 014e0000 02a4bc88 06f0fdbc kernel32!FreeLibrary+0x41 (FPO: [1,0,0])
....

我注意到行ntdll!RtlEnterCriticalSection + 0xa8(FPO:[1,1,0]),我认为这应该是与critical_section相关的。所以我在windbg中使用了dt命令来显示有关它的CRITICAL_SECTION信息
0:037> dt 7c8897a0 RTL_CRITICAL_SECTION
SiteAdminSvc!RTL_CRITICAL_SECTION
   +0x000 DebugInfo        : 0x7c8897c0 _RTL_CRITICAL_SECTION_DEBUG
   +0x004 LockCount        : -18
   +0x008 RecursionCount   : 1
   +0x00c OwningThread     : 0x00002098
   +0x010 LockSemaphore    : 0x00000718
   +0x014 SpinCount        : 0

+ 0x00c OwningThread行:0x00002098表明Critical_section由线程0x2098保留,但是很奇怪,我什至无法在线程列表中找到这样的线程。

还有其他方法可以找出为什么FreeLibrary被阻止吗?

PS:还有一个关于饥饿的故事。如果我使用远程调试器调试应用程序,则无法挂起。但是如果我在服务器上启动应用程序。它确实
非常感谢

最佳答案

我假设您在不允许的时间调用FreeLibrary(例如DllMain)

Why not call FreeLibrary from entry point function?

MSDN:loaderLock MDA

> However, Iapparently cannot call FreeLibrary from the DllMain PROCESS_DETACH event

关于c++ - 应用程序在自由库中挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5829200/

10-09 18:55