2013-05-06 72 views
0

我正在調試Visual Studio 2008中的一段代碼,同時運行程序引發一個緩衝區溢出運行,我想用數據寫入斷點測試變量,有人可以告訴我如何在變量上寫入數據寫入斷點如何在Visual Studio 2008中寫入數據寫入斷點

+0

讀/寫斷點通常爲硬件斷點實現,並且同樣地,需要在編譯時是已知的地址。這是 - 至少據我所知 - 不可能用自動變量。 – 2013-05-06 20:49:14

+0

我們在談論自動變量嗎?他可以首先使用常規斷點來確定地址,然後放置數據斷點。見Hans Passant的回答。 – 2013-05-06 23:48:09

+0

自Visual Studio 2005以來,您還可以使用/ GS編譯器開關,該開關提供帶金絲雀字的緩衝區溢出保護:[link](http://msdn.microsoft.com/en-us/library/8dbf701c%28v=VS。 80%29.aspx)。如果使用該功能,緩衝區溢出將最終導致異常,您可以中斷該異常。 – 2013-05-06 23:52:01

回答

1

這本來是更實際的,如果你給一個代碼段。我不得不讓我自己:

void foo() { 
    int ix = 0x42; 
    int jx; 
    long long* p = (long long*)&ix; 
    *p = 0x100000042LL; 
} 

的這種有意的堆棧損壞嘗試將打破調試器:

enter image description here

所以我在函數入口設置斷點,後設數據斷點變量 「九」 與調試+新建斷點+新數據斷點的地址:

enter image description here

然後按F5繼續運行。數據斷點觸發:

enter image description here

+0

好的截圖!我會補充說,根據我的經驗,數據斷點會顯着減慢調試程序的速度。但是,這可能是真正可以接受的折衷,有利於發現錯誤。 – 2013-05-06 23:45:44

+1

它不會減慢任何速度。它們由具有調試寄存器的處理器實現。你只能設置其中四個的原因。條件斷點會導致速度減慢。 – 2013-05-07 00:15:11

+0

嗯,你肯定是對的。 – 2013-05-07 00:32:22

0

執行此操作的最佳方法是使用WinDbg。 Visual Studio在打破數據寫入或數據讀取方面不太好。您可以從http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx免費獲得WinDbg您可以在線獲得WinDbg的大量幫助,包括如何使用它來破解數據點讀取,讀取/寫入或只是寫入。微軟提供了我列出的URL的鏈接,並且http://windbg.info有很多關於使用WinDbg的信息。

但是,如果您堅持使用Visual Studio 2008,則執行此操作的方法是在您的Visual Studio調試器下啓動該程序。在您感興趣的變量處於活動狀態的代碼中設置一個斷點。一旦調試器在您的斷點處斷開執行,您可以使用「新斷點」菜單在變量讀或寫上添加新的斷點。您可能需要選擇您感興趣的變量,然後使用上下文選擇來啓動「新斷點」。選擇「數據點訪問」,並選擇它是用於讀取還是寫入或讀取/寫入訪問。

欲瞭解更多詳情,請諮詢:http://msdn.microsoft.com/en-us/library/350dyxd0(v=VS.90).aspx