VS 断点设置
位置斷點(diǎn):
????????????? 就是普通的按F9設(shè)置的斷點(diǎn),沒什么好說的.
?
臨時(shí)改變變量值:
1)通過“即時(shí)窗口”(調(diào)試->窗口->即時(shí)),可以在程序運(yùn)行過程中(當(dāng)然是在斷點(diǎn)狀態(tài)下),臨時(shí)改變某個(gè)變量的取值(比如在即時(shí)窗口中輸入Width = 32,然后回車使其生效,左邊局部變量會(huì)將改的值顯示為紅色)!
?
2)直接在局部變量的值上雙擊,再輸入要改的值
3)鼠標(biāo)停留在要改的變量上,在彈出的變量值上單擊,輸入要改的值
?
?
優(yōu)點(diǎn):可以不必為調(diào)試變量的每一個(gè)取值而不停地終止測(cè)試/修改代碼/重新調(diào)試,尤其當(dāng)需要反復(fù)測(cè)試一個(gè)變量的正常取值時(shí)。
?
數(shù)據(jù)斷點(diǎn):
注意,這個(gè)技巧僅對(duì)C++程序調(diào)試有效(或者說native程序),而且你只能在中斷模式下才能設(shè)置數(shù)據(jù)斷點(diǎn),另外你還只能在本機(jī)設(shè)置數(shù)據(jù)斷點(diǎn)。
上一節(jié)的例子里,我們提到了,有的時(shí)候一個(gè)全局變量被修改了以后,你可能都找不到它是什么時(shí)候被修改的,于是夜已深,人已寐,你還在辛苦地調(diào)試到底是哪個(gè)鬼地方把這個(gè)變量的值修改了。F11, F10,……,SHIFT + F11,……,F5,靠,調(diào)過了,重來,F11,F10,……
這種情況下,數(shù)據(jù)斷點(diǎn)就很有用了,Visual Studio允許你在變量被修改的時(shí)候,中斷程序的執(zhí)行,是不是很酷?
默認(rèn)情況下,你是找不到數(shù)據(jù)斷點(diǎn)這個(gè)菜單的,需要執(zhí)行下面的步驟把它拉出來:
1 打開你要調(diào)試的項(xiàng)目。
2 點(diǎn)擊Visual Studio菜單欄里面的“工具(Tools)”—“自定義(Customize…)”。然后在“自定義(Customize…)”窗口中選擇“命令(Commands)”頁簽里面的“種類(Categories)”列表框里的“調(diào)試(Debug)”,找到“新數(shù)據(jù)斷點(diǎn)(New Data Breakpoint)”,將它拖到菜單欄里面相應(yīng)的位置。
然后打開或者創(chuàng)建一個(gè)C++項(xiàng)目,我們以下面的源代碼為例子:
#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;
}
我們現(xiàn)在要Visual Studio在更改g_Variable的時(shí)候中斷程序的執(zhí)行。
1 單擊F11,這樣程序就會(huì)在_tmain函數(shù)里面中斷了,我們也就有機(jī)會(huì)設(shè)置數(shù)據(jù)斷點(diǎn)了。
2 點(diǎn)擊菜單里面的“新數(shù)據(jù)斷點(diǎn)(New Data Breakpoint)”。注意,數(shù)據(jù)斷點(diǎn)是通過監(jiān)視內(nèi)存地址某一段區(qū)域更改來實(shí)現(xiàn)的,因此你必須提供一個(gè)內(nèi)存地址(或者說就是指針吧),這里g_Variable是一個(gè)整形變量,因此你需要使用“&g_Variable”的形式來創(chuàng)建一個(gè)數(shù)據(jù)斷點(diǎn),因?yàn)檎蔚?大小是4個(gè)字節(jié),因此數(shù)據(jù)斷點(diǎn)監(jiān)視的區(qū)域是4個(gè)字節(jié)。
????????????????????????????????????????????????????????????? 圖3 斷點(diǎn)監(jiān)視區(qū)域
?
3 繼續(xù)程序的執(zhí)行,這時(shí)會(huì)彈出一個(gè)對(duì)話框,告訴你有一個(gè)內(nèi)存地址的內(nèi)容發(fā)生了變化(說明我們的數(shù)據(jù)斷點(diǎn)生效了),這時(shí)代碼行指向的是數(shù)據(jù)被修改的下一行代碼。
??????????????????????????????????????????? 圖4 運(yùn)行提示
為什么數(shù)據(jù)斷點(diǎn)只能在C++/C程序中才能設(shè)置?是因?yàn)橥泄艽a有垃圾回收。而數(shù)據(jù)斷點(diǎn)的執(zhí)行原理應(yīng)該是Windows內(nèi)存管理里面的Guard Pages概念和VirtualProtectEx函數(shù)的實(shí)現(xiàn)。這個(gè)概念可以自己去查MSDN的內(nèi)存管理方面的文檔。
?
條件斷點(diǎn):
?今天在調(diào)一個(gè)漏洞修復(fù)的crash的時(shí)候,進(jìn)入了一個(gè)很大的循環(huán),循環(huán)不停地檢測(cè)是否有當(dāng)前漏洞,斷點(diǎn)打在循環(huán)體里面,已知出問題的漏洞的KB號(hào),但是如果要在剛好掃描到這個(gè)KB號(hào)的時(shí)候斷下來,還有點(diǎn)小麻煩,我又不想改代碼用if斷下來,其實(shí)VS2005做到這個(gè)非常簡(jiǎn)單,設(shè)置條件斷點(diǎn)就行了,在斷點(diǎn)的右邊(#add 不能剛好在斷點(diǎn)圖標(biāo)上) 右鍵單擊會(huì)彈出斷點(diǎn)條件設(shè)置菜單:
?
?
?????
?
????? 然后再點(diǎn)擊 Condition... 輸入條件 KBID == 977150,確定即可:
?
????? 這個(gè)里面還有一個(gè)Has changed選項(xiàng),可以跟蹤某個(gè)變量變化的情況下斷下來,牛叉。
????? 菜單上還有其他的一些功能:
????? 1、HitCount...可以設(shè)置命中幾次后,或命中次數(shù)是某數(shù)的倍數(shù),或者命中次數(shù)大于某數(shù)時(shí)斷下來(命中就是只執(zhí)行到斷點(diǎn)處)
????? 2、Filter...顧名思義,就是過濾,可以設(shè)置只有某些外部條件滿足時(shí)才觸發(fā)斷點(diǎn)
????? 3、When Hit...根據(jù)英文意思是當(dāng)斷下來的時(shí)候,干嘛干嘛,可以打印一串字符串啊,×××的,還可以運(yùn)行宏,太牛B了,不過我還沒有深究怎么弄。要運(yùn)行宏的話,是用vbs寫的,并事先導(dǎo)入到vs2005里面。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/weiqubo/archive/2011/04/15/2017515.html
總結(jié)
- 上一篇: 【新手答疑】想解决网站卡顿情况就用这几种
- 下一篇: poj hdu Tian Ji --