使用_beginthreadex创建线程时调试应用程序挂起

时间:2011-04-13 09:10:20

标签: c++ windows multithreading

我在网站上遇到一个奇怪的问题,我们的应用程序在启动时挂起。 我得到了现场自定义生成的crashdump,它显示主线程被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) 
...

我从这个callstack中得不到任何东西,但只是知道主线程在创建新线程时被卡住了。 这是系统问题吗?

2 个答案:

答案 0 :(得分:3)

你是否在DllMain(或某些DLL初始化)中启动此线程?它似乎在臭名昭着的装载机锁上陷入僵局。有关DllMain允许(非常少)的详细信息,请参阅以下文档:

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

作为参考,这里有一些关于加载器锁的链接可能会有所帮助,无论你是否有混合使用DllMain:

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

来自Raymond Chen的“Old New Thing”的链接节日:

答案 1 :(得分:0)

好吧,它正在等待运行(HMODULE)可执行文件的模块。您可能想看看是否已打开这样的句柄,尤其是当它被锁定以进行共享阅读时。

来自Sysinternals(Microsoft)的procexp.exe可能有助于找到被阻止的句柄。或者您可以仔细检查任何HMODULE句柄,LoadLibrary调用以找到罪魁祸首

相关问题