簡體   English   中英

我可以相信在發生在C ++ / STL / MFC應用程序啟動初期的致命異常中的堆棧回溯符號名稱嗎?

[英]Can I trust the stack traceback symbol names in a fatal exception that occurs early in the startup in my C++/STL/MFC application?

我在調用堆棧中最深的項目CObject:IsKindOf mfc90d.dll中遇到訪問沖突,實際上它顯然在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 ,這向我暗示,當mfc90d.dll加載時,此代碼實際上已運行。 大概是這樣嗎? 我可以在VC ++ 2008調試器中進行任何操作來獲得“何時運行此代碼”的清晰視圖嗎?

  4. 要求某人為我猜測在我的應用程序生命周期的早期發生崩潰是不合理的。 我對您如何調試此類問題感興趣,因此,如果其中任何一個對您有所幫助,我將不勝感激您的想法和構想,但是要讓任何人去猜測到底發生了什么實在是太多了。 讓我們以某種方式說這是隨機堆損壞。 但是,如果您對“從在dll中使用MFC切換為靜態鏈接MFC”的順序有一些建議,我想聽聽。

根據我的經驗,ntdll.DLL下面的任何內容都是紅色的鯡魚。 您的std映射未調用名為win main的ntdll中的代碼。 調試器正在解釋廢話,並試圖弄明白這一點,並且一些半隨機二進制數據的地址與您的函數之一對齊。 假裝它不在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM