2010-12-14 84 views
2

我有一個在VC 2008(C++)中開發的應用程序,它使用使用openssl dll的軸dll。而且,連鎖中的某個人會破壞堆 - 這種情況最終會在我的應用程序中在違反應該/不會發生的地方給我「內存訪問違規」。所以,鏈中的某個人會破壞一些東西,但我找不到誰或什麼。查找內存違規/泄漏

我嘗試使用DevPartner的工具進行內存泄漏,但沒有發現任何泄漏 - 沒有任何內容。

我該如何解決這個問題?我多次查看axis和ssl文檔,並執行並檢查了所有可能的內存管理問題和修復,但無濟於事。

非常感謝! Marin

+1

你確定這不是你自己的代碼嗎?在發佈之前,圖書館會檢查這些類型的問題。 – DumbCoder 2010-12-14 13:18:36

+0

你有錯誤發生時的堆棧跟蹤嗎?你可以試試windbg。 – 2010-12-14 13:23:34

+0

看看這個問題:http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows。它不直接回答你的問題,但有很多好的工具提到。 – 2010-12-14 14:20:03

回答

2

如果你得到了庫的調試版本,MSVC提供了一個調試malloc和free,以及一個debug new和delete。這些包含重寫檢測等內容。

http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx

+0

嘗試過,但我沒有得到它們的輸出,我得到的全部是 CardTerminalDesktopApplication.exe中0x0066ca60的第一次機會異常:0xC0000005:訪問衝突讀取位置0x0173613c。 CardTerminalDesktopApplication.exe中的0x0066ca60未處理的異常:0xC0000005:訪問衝突讀取位置0x0173613c。 一旦它已經崩潰。 – Marin 2010-12-14 14:27:48

+1

我設法得到有效的答覆,是的 - 我得到泄漏!但是不推薦使用輸出,例如:{145} 0x007F7328處的常規塊,64字節長。 數據: 46 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 61 6E 64 ....我怎樣才能獲得更豐富的信息?我定義了#define _CRTDBG_MAP_ALLOC ... – Marin 2010-12-14 14:42:34

3

嘗試使用MS application verifier。它與Visual Studio集成在一起,因此您可以直接通過它進行「驗證」運行。

3

爲什麼你認爲泄漏可能是一個腐敗莫名其妙負責?你需要注意超出範圍的訪問,死指針訪問,非法casts和類似的東西,而不是泄漏。這是一件棘手的事情。 Valgrind是追逐這類問題的好工具,但不幸的是它不適用於Win32。如果你的代碼是可移植的,你可以嘗試在Linux上進行調試,否則你需要使用像Purify這樣的商業工具,或者採用古老的方式,藉助日誌記錄和斷言以及調試器。