VS 断点设置
位置斷點:
????????????? 就是普通的按F9設置的斷點,沒什么好說的.
?
臨時改變變量值:
1)通過“即時窗口”(調試->窗口->即時),可以在程序運行過程中(當然是在斷點狀態下),臨時改變某個變量的取值(比如在即時窗口中輸入Width = 32,然后回車使其生效,左邊局部變量會將改的值顯示為紅色)!
?
2)直接在局部變量的值上雙擊,再輸入要改的值
3)鼠標停留在要改的變量上,在彈出的變量值上單擊,輸入要改的值
?
?
優點:可以不必為調試變量的每一個取值而不停地終止測試/修改代碼/重新調試,尤其當需要反復測試一個變量的正常取值時。
?
數據斷點:
注意,這個技巧僅對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的內存管理方面的文檔。
?
條件斷點:
?今天在調一個漏洞修復的crash的時候,進入了一個很大的循環,循環不停地檢測是否有當前漏洞,斷點打在循環體里面,已知出問題的漏洞的KB號,但是如果要在剛好掃描到這個KB號的時候斷下來,還有點小麻煩,我又不想改代碼用if斷下來,其實VS2005做到這個非常簡單,設置條件斷點就行了,在斷點的右邊(#add 不能剛好在斷點圖標上) 右鍵單擊會彈出斷點條件設置菜單:
?
?
?????
?
????? 然后再點擊 Condition... 輸入條件 KBID == 977150,確定即可:
?
????? 這個里面還有一個Has changed選項,可以跟蹤某個變量變化的情況下斷下來,牛叉。
????? 菜單上還有其他的一些功能:
????? 1、HitCount...可以設置命中幾次后,或命中次數是某數的倍數,或者命中次數大于某數時斷下來(命中就是只執行到斷點處)
????? 2、Filter...顧名思義,就是過濾,可以設置只有某些外部條件滿足時才觸發斷點
????? 3、When Hit...根據英文意思是當斷下來的時候,干嘛干嘛,可以打印一串字符串啊,×××的,還可以運行宏,太牛B了,不過我還沒有深究怎么弄。要運行宏的話,是用vbs寫的,并事先導入到vs2005里面。
?
?
?
轉載于:https://www.cnblogs.com/weiqubo/archive/2011/04/15/2017515.html
總結
- 上一篇: 【新手答疑】想解决网站卡顿情况就用这几种
- 下一篇: 高手必知的iPhone四大隐私设置