1

我在mfc90d.dllin 中遇到访问冲突CObject:IsKindOf,这是调用堆栈上最深的项目,实际上显然很久以前运行过WinMainCRTStartup,并且可能在我的应用程序中,因为我为我的应用程序的一些模型对象编写了一个标准容器; std::map<int, CDevice*>某处,导致以下模板化容器 C++ 类型存在,然后出现在我的调用堆栈中:

myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice   
         *,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> 
          >::_Copy(const std::_Tree<std::_Tmap_traits<int,CDevice 
         *,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> > &                     
         _Right={...})  Line 1067 + 0x1d bytes  C++

我不是 100% 确定这std::map<int, CDevice*>是原因,但它是我能找到的唯一涉及“CDevice*”的模板参考。

整个调用堆栈,稍微简化(省略号...表示省略了函数签名的一些细节)。

mfc90d.dll!CObject::IsKindOf(const CRuntimeClass * pClass=0x691a09ec)  
mfc90d.dll!CDocManager::OpenDocumentFile(const char * lpszFileName=0x007783e8)  
mfc90d.dll!CWinApp::OpenDocumentFile(const char * lpszFileName=0x007783e8)  
myapp.exe!CServerApp::InitInstance()  
mfc90d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * ...            
    myapp.exe!__tmainCRTStartup()  Line 574 + 0x35 bytes    C
myapp.exe!WinMainCRTStartup()  Line 399 C
kernel32.dll!762033aa()     
ntdll.dll!77369ef2()    
ntdll.dll!77369ec5()    
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice ..........

问题:

  1. 我对如何std::_Tree<...>::_Copy执行这么多层的东西感到有点困惑,上面有四个完整的调用层myapp.exe!WinMainCRTStartup。我应该怀疑上面的调用堆栈不正确吗?

  2. 什么是像上面那样的 std::_Tree<...> 混乱,为什么要调用它CObject:IsKindOf?我的代码使用这样的 STL: std::map<int, CDevice*>.
    我的猜测是,如果我删除所有引用,std::map<int, CDevice*>那么上面的std::_Tree内部实现代码就会消失。

  3. 之前运行这么远WinMainCRTStartup向我表明,这段代码实际上是在mfc90d.dll加载时运行的。大概是这样吗?我可以在 VC++2008 调试器中做些什么来更清楚地了解“这段代码什么时候运行?”

  4. 在我的应用程序生命周期的早期,让某人为我猜测到底是如何发生崩溃是不合理的。不过,我对您如何调试此类问题很感兴趣,因此,如果其中任何一个对您敲响了警钟,我将不胜感激您的想法和想法,但是让任何人猜测真正发生的事情太过分了。让我们说这是随机堆损坏,不知何故。但是,如果您对“从在 dll 中使用 MFC 切换到静态链接 MFC”的顺序有提示,我想听听这些。

4

1 回答 1

1

根据我的经验,ntdll.DLL 以下的任何内容都是红鲱鱼。您的标准映射没有调用 ntdll 中调用 win main 的代码。调试器正在解释废话并试图理解它,并且一些半随机二进制数据的地址与您的一个函数对齐。假装它不存在。

于 2012-11-24T20:38:12.247 回答