2012-04-06 61 views
1

在我的代碼中,我有一個對象,其內容完全是垃圾。我猜在代碼的其他部分發生了錯誤的寫作,並且在我提到的對象的地址處寫了(不)運氣。如何檢測錯誤寫入

我想知道是否有一些工具可以告訴我每次寫入內存地址時都會收到,所以我可以跟蹤這個錯誤的來源。

回答

4

大多數調試器在寫入時支持斷點。例如在Visual Studio中,您必須在調試器中啓動您的應用程序,打入(在正常斷點附近初始化可疑變量),然後進入菜單中的「調試/新斷點/新數據斷點」。

在SoftIce中,您可以使用BPM命令。 :)這也可以打破內存訪問。

+2

任何知道SoftIce的人都會從我那裏得到+1。 – ildjarn 2012-04-06 04:24:40

+0

美好的舊時光... :) – Eugene 2012-04-06 04:48:14

0

根據你的平臺,你應該能夠使用像VirtualProtect(我認爲它是linux上的mprotect)來鎖定內存區域。這樣,當訪問不正確的內存區域時,將會出現訪問違規/段錯誤。當你獲得accessviolation/segfault時,你可以在調試器中捕獲它們。

但是,要鎖定內存區域,通常區域應與內存頁面(至少在窗口上)對齊,這可能是一個問題。

除此之外,您可以在調試器中使用數據斷點。

0

如果您使用的是Windows,則可以使用Global Flags(gflags.exe,作爲Windows調試工具的一部分)並打開PageHeap。 (在圖像選項卡上,鍵入您的.exe的名稱,然後當它顯示時點擊「啓用頁面堆」複選框。)然後運行您的程序。

只要記得在完成後再關閉它。