如何解决使用beginthreadex创建调试线程时挂起的调试应用程序
| 我在网站上遇到一个奇怪的问题,我们的应用程序在启动时被挂起。 我在现场获得了自定义生成的崩溃转储,它显示主线程被beginthreadex api卡住了。 这是调用栈:0:006> kv
ChildEBP
0161ebb8 ntdll!KiFastSystemCallRet (FPO: [0,0])
0161ebbc ntdll!ZwWaitForSingleObject+0xc (FPO: [3,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])
0161ed30 kernel32!GetModuleHandleForUnicodeString+0x20 (FPO: [SEH])
0161f1a8 kernel32!BasepGetModuleHandleExW+0x17f (FPO: [SEH])
0161f1c0 kernel32!GetModuleHandleW+0x29 (FPO: [1,0])
0161f1cc kernel32!GetModuleHandleA+0x2d (FPO: [1,0])
0161f204 msvcr80!initptd+0x17
0161f224 msvcr80!beginthreadex+0x56
0161f248 ZQCommonStlp!ZQ::common::NativeThread::NativeThread+0x59 (FPO: [Non-Fpo]) (CONV: thiscall)
...
我没有从此调用堆栈中得到任何信息,但只知道在创建新线程时主线程卡住了。
这是系统问题吗?
解决方法
您是否正在DllMain(或某些DLL初始化)中扩展此线程?它似乎在臭名昭著的加载器锁上陷入僵局。有关DllMain中允许的内容(很少)的详细信息,请参见以下文档:
http://msdn.microsoft.com/zh-CN/windows/hardware/gg487379.aspx
在这种情况下,运行时功能“ 1”正在调用“ 2”。
作为参考,无论您是否有DllMain,这里有一些关于加载程序锁的链接可能会有所帮助:
DllMain的文档,其中包含一些严厉的警告:http://msdn.microsoft.com/en-us/library/ms682583.aspx
还有雷蒙德·陈(Raymond Chen)的“旧新事物”的链接节:
在DllMain中不做任何令人恐惧的事情的一些原因
在DllMain中不做任何令人恐惧的另一个原因:无意死锁
流程关闭难题
是从DllMain死锁创建线程还是不是?
,好了,它正在等待获取正在运行的(HMODULE)可执行文件的模块。您可能想要查看是否已打开这样的句柄,尤其是在为共享阅读而将其锁定时。
也许来自Sysinternals(微软)的ѭ3可以帮助找到被阻塞的句柄。或者,您可以仔细检查任何HMODULE句柄,LoadLibrary调用以找到罪魁祸首
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。