簡體   English   中英

C ++中的Visual Studio調試錯誤

[英]Visual Studio Debuging Errors in C++

由於某種原因,一旦我引用了第三方供應商的dll類,集成調試器就會導致錯誤。 此相同的代碼在構建並作為發行版運行時會獨立運行。 調試和發布的兩個屬性應該相同,因為我沒有真正更改它們。 我將lib文件添加到兩個版本的路徑中。 我只是有:

ClassNameFromDll blah;

當到達這里時,我得到了這個異常:

MTGO SO Bot.exe中0x78a3f623(mfc90ud.dll)的未處理異常:0xC0000005:訪問沖突讀取位置0xf78e4568。

它出現在:afxtls.cpp,第252行。

這是一個MFC應用程序,但是除了一個非常簡單的gui之外,我沒有真正使用任何MFC,它會觸發一個完全為win32的事件。 我正在使用Visual Studio 2008 Express。

查看我的VC9安裝中的atltls.cpp文件,此處發生崩潰:

inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
    EnterCriticalSection(&m_sect);
    ASSERT(nSlot != 0 && nSlot < m_nMax);
    ASSERT(m_pSlotData != NULL);
    ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);   // <== crash
    // ...
}

因此,在發布版本中不會發生崩潰的原因是因為ASSERT()在該版本中是無操作的。 我不熟悉ATL對線程本地存儲的使用,但是此斷言表明某事正在請求尚未存儲任何內容的插槽中的值。

我不知道該TLS插槽的初始化是您的責任還是第三方DLL的責任。

看起來GetThreadValue()具有一些附加保護,例如它將在發行版本中為未初始化的插槽返回NULL指針(盡管我不確定這是否可以保證)-我敢打賭,第三方DLL依賴於該行為(即,它檢查是否為NULL返回),因此在發行版本中不會發生崩潰。 請注意,供應商可能會間接使用CThreadSlotData類(堆棧跟蹤會提供有關此方面的線索),因此他們可能不知道其期望。

進行心理調試

它可以在釋放模式下正常運行,而在調試模式下崩潰,這一事實使我相信您已經設法以某種方式設法引用了該DLL的發行版(mfc90u.dll),而不是引用了庫本身並允許鏈接器決定要導入的版本。

您可能沒有在此應用程序中使用MFC,但如果它是作為MFC應用程序構建的,則無論是否需要,您都將獲得所有MFC的東西(這意味着您還必須解決MFC依賴性問題並交付MFC依賴項)。帶有您的應用的MFC DLL)。

您有可以發布的堆棧跟蹤嗎? 它可能有一些有用的信息。

如果供應商仍在積極支持第三方DLL,那么您應該做的第一件事就是查看可以發送給供應商並要求他們修復的非常簡單的程序是否會遇到相同的問題。

如果供應商不可用或響應速度不夠:

如果您擁有第三方DLL的源代碼並且可以輕松地構建自己的版本,則可能是調試此版本的最佳方法(缺少供應商的支持)。 即使您無法輕松構建可通過源代碼調試的DLL,也可以跟蹤構造函數的匯編指令,並將源代碼用作映射來幫助您了解正在發生的事情。

即使您沒有第三方DLL的源代碼,我也認為最好的做法是通過ClassNameFromDll的構造函數進行跟蹤,以找出問題所在。 比較Debug版本和Release版本中的指令路徑可能會有所幫助。

MFC源代碼隨MSVC一起分發(可能不隨Express版本一起發布,但我認為與所有其他版本一起發布),因此當您進入MFC DLL的代碼時,您可能會發現該源代碼有助於確定正在發生的事情。

暫無
暫無

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

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