使用beginthreadex创build线程时挂起debugging应用程序

我在网站上遇到一个奇怪的问题,我们的应用程序在启动时挂起。 我得到了现场自定义生成的崩溃转储,并显示主线程被beginthreadex api卡住了。 这里是callstack:

0:006> kv ChildEBP 0161ebb8 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 0161ebbc ntdll!ZwWaitForSingleObject+0xc (FPO: [3,0,0]) 0161ebf8 ntdll!RtlpWaitOnCriticalSection+0x1a3 (FPO: [2,7,4]) 0161ec18 ntdll!RtlEnterCriticalSection+0xa8 (FPO: [1,1,0]) 0161ec4c ntdll!LdrLockLoaderLock+0x133 (FPO: [SEH]) 0161ecc8 ntdll!LdrGetDllHandleEx+0x94 (FPO: [SEH]) 0161ece4 ntdll!LdrGetDllHandle+0x18 (FPO: [4,0,0]) 0161ed30 kernel32!GetModuleHandleForUnicodeString+0x20 (FPO: [SEH]) 0161f1a8 kernel32!BasepGetModuleHandleExW+0x17f (FPO: [SEH]) 0161f1c0 kernel32!GetModuleHandleW+0x29 (FPO: [1,0,0]) 0161f1cc kernel32!GetModuleHandleA+0x2d (FPO: [1,0,0]) 0161f204 msvcr80!initptd+0x17 0161f224 msvcr80!beginthreadex+0x56 0161f248 ZQCommonStlp!ZQ::common::NativeThread::NativeThread+0x59 (FPO: [Non-Fpo]) (CONV: thiscall) ... 

我从这个调用堆栈没有得到任何东西,但只知道主线程在创build新线程时被卡住了。 这是一个系统问题?

你在DllMain(或一些DLL初始化)中旋转这个线程吗? 它似乎是臭名昭着的装载机锁死锁。 请参阅以下文档以了解DllMain中允许(很少)的详细信息:

在这种特殊情况下,运行时函数_initptd()正在调用GetmoduleeHandle("KERNEL32.DLL")

作为参考,这里有一些关于加载器锁定的链接,可能是有帮助的,无论你是否有一个DllMain:

DllMain的文档,有一些严厉的警告: http : //msdn.microsoft.com/en-us/library/ms682583.aspx

还有一个来自Raymond Chen的“旧新事物”的环节:

  • 一些理由不要在你的DllMain中做任何可怕的事情
  • 另一个在DllMain中不要做任何可怕事情的原因是:无意之间的僵局
  • 一个进程关闭难题
  • 从DllMain死锁创建一个线程还是不是?

那么它正在等待运行(HMODULE)可执行文件的模块。 你可能想看看你是否已经打开了这样的句柄,特别是当它被锁定共享阅读时。

也许从Sysinternals( 微软 ) procexp.exe可以帮助找到被阻止的句柄。 或者你可以仔细检查任何HMODULE句柄,LoadLibrary调用找到罪魁祸首