2009-02-05 147 views
1

由於某些原因,集成調試器是導致一旦我引用第三方供應商的dll類時就會報錯。這個相同的代碼在構建時運行,並作爲發佈版單獨運行。調試和發佈的兩個屬性應該與我沒有真正改變它們相同。我將lib文件添加到兩個版本的路徑中。我只是有:Visual Studio在C++中調試錯誤

ClassNameFromDll blah; 

當它到達這裏,我得到這個異常:

未處理的0x78a3f623(mfc90ud.dll)例外MTGO SO Bot.exe: 0000005:訪問衝突讀取位置0xf78e4568 。

它發生在:afxtls.cpp,線252

這是一個MFC應用程序,但我真的不使用任何MFC除了一個非常簡單的GUI它將觸發關閉的事件是所有的Win32。我正在使用Visual Studio 2008 Express。

回答

1

從事心理調試

,它在釋放模式精細運行,在調試模式下崩潰使我相信,你總算參考,具體而言,該DLL的發行版本的事實(mfc90u .dll),而不是引用庫本身,並允許鏈接器決定要導入哪個版本。

您可能不會在此應用程序中使用任何MFC,但如果它是作爲MFC應用程序構建的,則無論您是否需要,都將獲得所有MFC的東西(這意味着您還必須解決MFC依賴性問題問題並將MFC DLL與您的應用程序一起發佈)。

+0

嘿,也許我應該把所有的代碼,並把它放回直c + +項目?我所需要的只是一個簡單的gui:1個textarea框,1個按鈕,1個按鈕按下的事件。 – Zombies 2009-02-05 15:56:19

+1

可能是最好的。 MFC只是爲一個窗口導入是一件相當沉重的事情。 – TheSmurf 2009-02-05 16:08:16

0

您是否有可以發佈的堆棧跟蹤?它可能有一些有用的信息。

如果第三方DLL仍然由供應商積極支持,那麼你應該做的第一件事是看看你是否可以用一個非常簡單的程序發生同樣的問題,你可以發送給供應商並要求他們修理它。

如果供應商不提供或不夠敏感:

如果有第三方DLL的源,並且可以輕鬆地建立自己的版本,你可能已經調試最好的辦法(簡稱獲得供應商支持你)。即使無法輕鬆構建可源代碼調試的DLL,也可以追蹤構造函數的彙編指令並將源代碼用作地圖,以幫助您瞭解正在發生的事情。

即使您沒有第三方DLL的源代碼,那麼我認爲最好的方法是通過構造函數追蹤ClassNameFromDll以試圖找出錯誤發生的原因。它可能有助於比較Debug版本與Release版本中的指令路徑。

MFC源代碼與MSVC(可能不是Express版本,但我認爲與所有其他版本)分發,所以當你進入MFC DLL代碼時,你可能會發現源代碼有助於找出什麼是有用的繼續。

2

看着atltls。從我VC9 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指針(雖然我不確定這會得到保證) - 我敢打賭第3第三方DLL依賴於該行爲(即,它檢查NULL返回),因此在發佈版本中不會發生崩潰。請注意,供應商可能間接使用CThreadSlotData類(堆棧跟蹤會給出關於此的線索),因此他們可能不知道它的期望。