日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS 断点设置

發(fā)布時(shí)間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS 断点设置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

位置斷點(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é)

以上是生活随笔為你收集整理的VS 断点设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。