內存變量被覆蓋的調試(數據斷點調試)

關於c++ vs2008中數據斷點的設置

http://blog.csdn.net/jphaoren/article/details/6270270

熟悉數據斷點的設置,能提高調試效率。

簡單看下,數據斷點是怎麼設置的。

  

一般來說,函數斷點在下面幾種情形下有用:

  1 例如調試一個網站程序,你通過分析網站的日誌發現最有可能發生錯誤的函數,打開調試器並將調試器附加到程序上去,設置函數斷點,重新執行網站……這樣做的好處是,不用到處打開源文件去找出錯的源代碼行,調試器會自動打開源代碼,並且在函數的入口處中斷(豈不是很方便?)。

  2 例如你在閱讀源代碼的時候,通常在讀到虛函數調用的時候,因爲通常這種調用都是通過基類指針調用的,而你又一時半會不知道到底有哪個繼承類的Overloading函數會被調用到,函數斷點可以告訴你。

  3 或者一種特殊的情形,你想讀一個程序的源代碼,但就是找不到入口Main函數,例如.NET程序,那麼直接在Visual Studio裏面按F11就能幫你找到入口函數—這是函數斷點的一個特殊情形。

  4 比如你在調試Web Service函數,設置函數斷點也是一個快捷的調試方法,這個技巧跟技巧1類似。

 

 

數據斷點

  注意,這個技巧僅對C++程序調試有效(或者說native程序),而且你只能在中斷模式下才能設置數據斷點,另外你還只能在本機設置數據斷點。

  上一節的例子裏,我們提到了,有的時候一個全局變量被修改了以後,你可能都找不到它是什麼時候被修改的,於是夜已深,人已寐,你還在辛苦地調試到底是哪個鬼地方把這個變量的值修改了。F11, F10,……,SHIFT + F11,……,F5,靠,調過了,重來,F11,F10,……

  這種情況下,數據斷點就很有用了,Visual Studio允許你在變量被修改的時候,中斷程序的執行,是不是很酷?

  默認情況下,你是找不到數據斷點這個菜單的,需要執行下面的步驟把它拉出來:

  1 打開你要調試的項目。

  2 點擊Visual Studio菜單欄裏面的“工具(Tools)”—“自定義(Customize…)”。然後在“自定義(Customize…)”窗口中選擇“命令(Commands)”頁籤裏面的“種類(Categories)”列表框裏的“調試(Debug)”,找到“新數據斷點(New Data Breakpoint)”,將它拖到菜單欄裏面相應的位置。

  然後打開或者創建一個C++項目,我們以下面的源代碼爲例子:

#include "stdafx.h"



int g_Variable = 0;



int _tmain(int argc, _TCHAR* argv[])

{



       printf("Before modifying data breakpoints"n");



       g_Variable = 1;



       printf("After modifying data breakpoints"n");



       return 0;

}

我們現在要Visual Studio在更改g_Variable的時候中斷程序的執行。

  1 單擊F11,這樣程序就會在_tmain函數裏面中斷了,我們也就有機會設置數據斷點了。

  2 點擊菜單裏面的“新數據斷點(New Data Breakpoint)”。注意,數據斷點是通過監視內存地址某一段區域更改來實現的,因此你必須提供一個內存地址(或者說就是指針吧),這裏g_Variable是一個整形變量,因此你需要使用“&g_Variable”的形式來創建一個數據斷點,因爲整形的 大小是4個字節,因此數據斷點監視的區域是4個字節。 

圖3 斷點監視區域
 

  3 繼續程序的執行,這時會彈出一個對話框,告訴你有一個內存地址的內容發生了變化(說明我們的數據斷點生效了),這時代碼行指向的是數據被修改的下一行代碼。

圖4 運行提示

  爲什麼數據斷點只能在C++/C程序中才能設置?是因爲託管代碼有垃圾回收。而數據斷點的執行原理應該是Windows內存管理裏面的Guard Pages概念和VirtualProtectEx函數的實現。這個概念可以自己去查MSDN的內存管理方面的文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章