c++ - 使用 beginthreadex 创建线程时调试应用程序挂起

标签 c++ windows multithreading

我在现场遇到一个奇怪的问题,我们的应用程序在启动时挂起。 现场拿到custom生成的crashdump,显示主线程被beginthreadex api卡住了。 这是调用堆栈:

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) 
...

我从这个调用堆栈中什么也没得到,但只知道主线程在创建新线程时卡住了。 这是系统问题吗?

最佳答案

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

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

作为引用,这里有一些关于加载程序锁的链接可能会有帮助,无论您是否有 DllMain:

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

还有来自 Raymond Chen 的“Old New Thing”的链接盛宴:

关于c++ - 使用 beginthreadex 创建线程时调试应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646865/

相关文章:

C static main return value of 0 在使用 free(someUnrelatedPointer) 之后改变了吗?

Windows批处理文件将某些文件类型从子目录复制到一个文件夹并重命名

python - 线程只运行一次函数,并且只返回一次值?如何连续返回函数值?

c++ - FFmpeg 卡在缓冲区填充 C++

c++ - 创建不使用虚拟基类的对象的克隆

windows - 为什么我不能终止这个 while 循环?

java - java中多线程的概念

Python多线程使用队列 - 程序永远被阻塞

c++ - 无法在 VS Code 中多次使用预启动任务

c++ - 缩短 C++ If 条件