gpt4 book ai didi

c++ - 为什么我的 MFC DLL 在接近启动时在单个线程上死锁?

转载 作者:行者123 更新时间:2023-11-30 03:11:33 32 4
gpt4 key购买 nike

使用 Visual Studio 2005,调试器告诉我在我正在编写的应用程序启动后发生了死锁 - 此时我正在使用 WinMain()。调用堆栈显示我们处于临界区,同时从 MFC DLL 中调用 AFX_MANAGE_STATE2(第 666 次,足够诡异)。这才刚刚开始发生:代码昨天运行良好。奇怪的是,回滚代码、重新启动 PC 并重建仍然会产生死锁。

当一切都停止时,我在调试器上按下暂停键,这条消息(最终)出现了:


微软 Visual Studio

该进程似乎已死锁(或未运行任何用户模式代码)。所有线程都已停止。

确定

调用堆栈如下所示:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwWaitForSingleObject@12() + 0xc bytes
ntdll.dll!_RtlpWaitForCriticalSection@4() + 0x8c bytes
ntdll.dll!_RtlEnterCriticalSection@4() + 0x46 bytes
mfc80ud.dll!CThreadSlotData::GetThreadValue(int nSlot=1) Line 247 C++
mfc80ud.dll!CThreadLocalObject::GetData(CNoTrackObject * (void)* pfnCreateObject=0x7832e030) Line 419 + 0x11 bytes C++
mfc80ud.dll!CThreadLocal<_AFX_THREAD_STATE>::GetData() Line 177 + 0xd bytes C++
mfc80ud.dll!AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE * pNewState=0x029a80d8) Line 57 + 0xa bytes C++
EmpireConsole.UnityDebug.dll!WIN_CON::SPOOL::BUFFER::overflow(unsigned short c=65) Line 979 + 0x13 bytes C++
Empire.UnityDebug.exe!UTILITYLIB::UniCharStreamBuf::sputc(CA::UniChar ch={...}) Line 113 + 0x68 bytes C++
Empire.UnityDebug.exe!UTILITYLIB::operator<<(UTILITYLIB::UniCharOStream & ucos={...}, const char * val=0x0888019c) Line 868 + 0x2f bytes C++
Empire.UnityDebug.exe!EMPIRE::ENVIRONMENT::auto_analyse() Line 319 + 0x2b bytes C++
Empire.UnityDebug.exe!EMPIRE::EMPIRE_APP_MODULE::run_vars(CA::UniString CmdLine={UniString [...] ...) Line 2531 C++
Empire.UnityDebug.exe!`anonymous namespace'::winmain_inner(HINSTANCE__ * hInstance=0x08440000, HINSTANCE__ * __formal=0x00000000, wchar_t * lpCmdLine=0x00020a92) Line 1981 C++
Empire.UnityDebug.exe!wWinMain(HINSTANCE__ * hInstance=0x08440000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x00020a92, int __formal=1) Line 4808 + 0x11 bytes C++
Empire.UnityDebug.exe!__tmainCRTStartup() Line 589 + 0x35 bytes C
Empire.UnityDebug.exe!wWinMainCRTStartup() Line 414 C
kernel32.dll!_BaseProcessStart@4() + 0x23 bytes

线程选项卡如下所示:

1008|wWinMainCRTStartup|CThreadSlotData::GetThreadValue|Normal|0

有时,这也会出现在线程选项卡中:

1596|_MixerCallbackThread@4|_KiFastSystemCallRet@0|Time Critical|0

但通常只有一个线程处于事件状态。

最佳答案

对于这个调试器,您需要将 Visual Studio 的集成调试器放在一边并使用 windbg,它了解等待对象并具有用于找出正在等待的对象以及(对于互斥体和关键部分)当前拥有的线程的命令对象。

一些额外的资源可以在这里找到:

http://www.debuginfo.com/articles/easywindbg.html#debugdeadlocks

http://blogs.msdn.com/greggm/archive/2004/02/05/68232.aspx

http://msdn.microsoft.com/en-us/magazine/cc164040.aspx

http://dalelane.co.uk/blog/?p=19

关于c++ - 为什么我的 MFC DLL 在接近启动时在单个线程上死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2201220/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com