我一直在努力檢測我們產品中的內存損壞錯誤。像valgrind這樣的內存檢測工具只會在崩潰時告訴問題,而不是實際發生損壞的時間。我已經看到,在使用調試版本時,它將在塊被釋放之前和之後檢查內存區域,並顯示調試斷言失敗,說明發生了堆損壞。那麼我可以在調試模式下重建我的產品以在發生錯誤時捕獲錯誤嗎?它是否也會捕獲緩衝區溢出等?我無法在互聯網上找到任何有關調試版本的信息,這些信息是針對內存錯誤檢測的。Visual C++調試版本是否識別堆損壞錯誤?
回答
我不確定調試版本,但對於內存損壞工具的一個很好的概述,你可以看看http://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools。它列出了Valgrind以及它應該能夠檢查的內容。
「C++」不是編譯器;供應商根據標準規格制定自己的(或多或少)。我可以告訴你,它通過在每個new
或malloc
塊周圍分配「哨兵」(當然僅在調試模式下)並用特殊模式填充它們(已被0xCD
當我上次使用它),然後它檢查守衛圍繞該位置的每個寫入。如果他們改變了,你會得到一個運行時錯誤,說堆已損壞。
順便說一下,緩衝區溢出是堆損壞。
編輯添加引用:http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
您可以在每個版本的Windows使用,以及在「頁堆」可用。 您可以使用隨Windows調試工具提供的gflags爲您的應用程序配置完整頁面堆。 然後,您可以在調試器下運行應用程序,即使在零售模式下也是如此。一旦遇到緩衝區溢出或訪問釋放的內存,調試器將停止。
我非常喜歡這個工具,因爲它是在OS中構建的,甚至可以在客戶站點激活(gflags只設置註冊表項,您可以簡單地將這些密鑰發送給您的客戶)。當我們提到(Windows調試工具)時,有些人會害怕。您可以使用Visual Studio來診斷問題。您需要的唯一東西是與您的二進制文件相對應的PDB(即使對於發佈版本,您也可以生成它們)。
那麼頁面堆機制就像調試版本一樣好?我的印象是,它只會在應用程序崩潰時創建一個核心轉儲文件(而不是在腐敗發生時預先提供)。 –
「全頁堆」嘗試在發生時檢測到損壞。在極少數情況下,它只能在稍後檢測到。如果您沒有附加調試器,它將生成轉儲。但是,如果您有調試器,WinDbg或Visual Studio,它將立即中斷。然後,您可以查看程序狀態,並從調用堆棧中找出崩潰的原因。您可以在發佈模式下執行此操作。但是,爲了便於調試,可以在編譯階段關閉優化。試試頁堆,我相信你會喜歡它的! –
- 1. 調試錯誤堆棧變量損壞
- 2. 堆損壞錯誤
- 3. 如何調試我的「堆損壞」? (C++)
- 4. Visual Studio的損壞版本
- 5. 損壞的堆 - C
- 6. 的Windows堆損壞C++ \ C
- 7. Visual Studio 2015調試器損壞 - 它是一個錯誤還是隻是我?
- 8. 如何調試可能的堆損壞?
- 9. 如何在armv5上調試堆損壞
- 10. C++堆損壞DETECTED - CRT
- 11. 堆棧損壞
- 12. C#損壞內存錯誤
- 13. Visual Studio - 如何找到堆損壞錯誤的來源
- 14. 合併排序 - 堆棧損壞錯誤
- 15. 堆棧周圍變量損壞錯誤
- 16. 堆損壞錯誤與刪除[]
- 17. 堆損壞錯誤 - 分配內存
- 18. c中的堆棧損壞
- 19. OpenCV 2.4.0 C++ goodFeaturesToTrack損壞堆?
- 20. 檢測到堆損壞| C++
- 21. C中的堆損壞
- 22. C++堆損壞和valgrind
- 23. C++ - UInt32上的堆損壞*
- 24. c堆棧變量損壞
- 25. 堆已損壞opencv
- 26. 堆棧損壞只用於調試配置C++
- 27. 在C++ int數組周圍的堆棧損壞錯誤
- 28. E_OUTOFMEMORY,堆損壞
- 29. Visual Studio中的FileOutputStream對象堆損壞
- 30. 調試內存損壞
我們的操作系統是什麼? – masebase
Windows。我正在使用visual C++ –