2011-03-12 58 views
0

我有這個工作來實現提供文件共享功能的庫。不會執行的行中的更改會破壞構建!

這已經發生過兩次:

首先,在字符串中的if-else路徑,只有當正在執行的路徑,但是,當我更改其他路徑的拼寫,軟件歷經數分鐘在std庫中崩潰。我通過附帶的調試進行了驗證,發現內存變化從未被觸及。當我扭轉變化,它再次很好地工作。其次,我的軟件再次在std庫上崩潰,out-of-array檢查到一個標準的basic_string析構函數中。

我做了一切,所有圖書館都匹配_HAS_ITERATOR_DEBUGGING

4個小時後,我發現有問題的文件是TorrentFile.cpp/h

如果我添加一個函數(即使它從來沒有被調用過),程序在該文件的末尾崩潰,但如果它不在那裏,就沒有錯誤。導致問題的代碼:

std::vector<TorrentFileListPacket> TorrentFile::GetFileMap() 
{ 
    std::vector<TorrentFileListPacket> vFiles; 
    return vFiles; 
}; 

如果我評論此代碼,崩潰消失了。

這真的讓我瘋狂!

我已經做了8年的開發人員,而且我從未見過這樣的事情!

其他信息

我的內存是好的,我使用Visual Studio 2010 SP1的Windows 7中的庫是從RasterBar libTorrent並將其鏈接到提高。該軟件使用MFC。

+1

由於C++有重載,因此不能假定不會調用新添加的函數。 –

+0

我將函數名設置爲GetFileMap101010101010101010101010101併發生同樣的崩潰! – bratao

+3

**重建所有** – Erik

回答

6

這種強烈的內存破壞在一個完全不同的位置,從你期望的崩潰位置聞起來。最有可能的添加和刪除功能是以這種方式改變內存佈局,導致內存損壞的影響立即可見或不可見。

你最好的希望就是像Purify或Valgrind那樣追捕它。

+0

我已經有應用程序驗證器與所有檢測ON(堆等..)。將嘗試Devparter(因爲Purify不會與VS2010一起使用)。感謝TIP – bratao

1

您可能想要確保所有的目標文件和庫都與ABI兼容。

衆多的編譯器設置將改變ABI。尤其是調試和發佈構建和迭代器調試。標準容器的結構佈局通常會在您啓用迭代器調試時發生變化(我相信默認情況下,msvc中的所有調試版本都處於默認狀態,對於發佈版本,此佈局不變)。

因此,如果您鏈​​接的單個目標文件,靜態庫或DLL使用不兼容的配置構建,通常會看到非常奇怪的行爲。使用libtorrent時,您需要確保使用與鏈接相同的配置構建庫。許多TORRENT_ *定義實際上會改變某些結構佈局或函數調用的某些方面。確保在構建庫時,在客戶端中定義完全相同的一組。處理這個問題的一個簡單方法是簡單地將所有源文件拖入您的項目並將所有內容一起構建。

0

如果你正在使用libtorrent作爲一個DLL(或爲此提升),它們是否針對相同的C運行時進行編譯?

通常當我遇到這種類型的問題時,這是因爲我調用了一個使用MinGW(使用VS6.0的CRT)或較早版本的Visual Studio編譯的庫。如果內存由庫分配,然後由應用程序釋放,則通常會在析構函數中獲得這些類型的錯誤。

如果您不確定,可以使用Dependency Walker這樣的工具打開有問題的DLL。查找相關性MSVCRT.DLL,MSVCR100.DLL等。