天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Visual Studio調(diào)試之?dāng)帱c進(jìn)階篇

文章導(dǎo)航

Visual Studio調(diào)試之?dāng)帱c基礎(chǔ)篇

Visual Studio調(diào)試之?dāng)帱c進(jìn)階篇

Visual Studio調(diào)試之?dāng)帱c技巧篇

在上一篇文章Visual Studio調(diào)試之?dāng)帱c基礎(chǔ)篇里面介紹了什么是斷點,INT Intel系列CPU的一個指令,可以讓程序產(chǎn)生一個中斷或者異常。程序中如果有中斷或者異常發(fā)生了以后,CPU會中斷程序的執(zhí)行,去一個叫做IDT的部件查找處理這個中斷(或者異常)的例程(Handler)。IDT是操作系統(tǒng)在啟動的時候初始化的,至于IDT的細(xì)節(jié)問題,例如什么是IDT,怎樣編寫一個IDT的例程,怎樣 初始化IDT,可以去網(wǎng)上搜索一些資料。

總之,這里我們只要知道,CPU在執(zhí)行程序指令過程中,碰到INT 3中斷程序的執(zhí)行,CPU然后去IDT表里面找到處理斷點的例程入口。這個例程要做的事情就是:

1.       先看看機(jī)器里面是不是安裝了一個調(diào)試器記住,這一步很重要,之所以重要以后的文章里面會介紹。

2.       如果機(jī)器里面沒有安裝調(diào)試器,那么操作系統(tǒng)就會終止程序的執(zhí)行。

3.       否則操作系統(tǒng)啟動調(diào)試器,并將調(diào)試器附到進(jìn)程上。

4.       這樣,我們才能在調(diào)試器里面檢查程序內(nèi)部變量的值。

前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我們自己在代碼里面硬編碼進(jìn)去的,因此我們在Visual Studio里,在相應(yīng)的代碼行里面點一下,出現(xiàn)一個小紅球,也就是說Visual Studio在程序指令集某個地方動態(tài)地添加了一個INT 3指令。現(xiàn)在的問題來了,Visual Studio是如何在程序中正確找到插入INT 3指令的位置的?

或者更具體一些,我們在源代碼(文本文件)里面設(shè)置斷點的,Visual Studio需要把代碼行翻譯成在程序指令集中的位置。Visual Studio之所以需要做翻譯,是因為通常一行C++或者 C#代碼都會對應(yīng)好幾行匯編指令。

因此,Visual Studio需要一個額外的文件來執(zhí)行這個翻譯過程,這個額外的文件叫做調(diào)試符號文件(Symbols),是由編譯器生成的。Visual Studio系列的編譯器,不論是C#VB.NET還是C++編譯器都會生成這個調(diào)試符號文件,.pdb 文件。所以如果你花一點時間看看Debug文件夾的話,你就會發(fā)現(xiàn)這個文件。

因此我們來看看Visual Studio支持的各種斷點,并解釋各種斷點的實現(xiàn)方式

條件斷點

首先我們先看看如何設(shè)置條件斷點,條件斷點有兩種,一種是根據(jù)觸發(fā)的次數(shù)來設(shè)置,另外一種是根據(jù)一條預(yù)置的條件來設(shè)置。

根據(jù)觸發(fā)次數(shù)設(shè)置

比如說,你有一個循環(huán),循環(huán)1000次,你知道有一個BUG總是在500次之后才會出現(xiàn),因此肯定希望在循環(huán)內(nèi)設(shè)置一個斷點,但是前面500次都不會觸發(fā)這個斷點,否則連續(xù)按500次的F5的確不是一件輕松的差事。

 

根據(jù)預(yù)置條件來設(shè)置

如果你已經(jīng)知道一些條件可能會引發(fā)Bug,那么根據(jù)條件來設(shè)置則最合適不過了。如下圖所示:

 

在“斷點條件(Breakpoint Condition)”對話框里面,只需要輸入一條正常的C#C++或者VB.NET的語句就可以了(當(dāng)然,語法是根據(jù)你項目里面的源代碼語法一致),這條語句的要求是必須返回bool否則就不是一個條件了。

第三個還有斷點過濾器,當(dāng)你在斷點上,右鍵點擊彈出的菜單里面,會有一個“過濾(Filter)”菜單,它允許你限制將斷點僅設(shè)置在特定的線程上。這里我就不細(xì)講了,有興趣的話,可以自己寫一個多線程或者多進(jìn)程程序試試這個功能。

知道斷點的原理以后,理解條件斷點應(yīng)該就不會是問題了。

監(jiān)視斷點(Watching Point

有的時候,你可能需要查看程序內(nèi)部一些變量的值,但是你又不希望中斷程序的執(zhí)行。例如你在調(diào)試一個網(wǎng)絡(luò)協(xié)議棧,一個程序可能在接收數(shù)據(jù)包,你想看看數(shù)據(jù)包的格式,但如果中斷程序的執(zhí)行,會導(dǎo)致后續(xù)的數(shù)據(jù)包丟失。

因此,我們一般的做法就是在源代碼里面加一些日志記錄代碼,這樣可以將一些變量的值記錄下來,以便后續(xù)分析。如果日志在產(chǎn)品發(fā)布以后還需要的話,在源代碼里面加入這些日志代碼固然是一個好主意,但是如果你只是想臨時看看一些變量的值呢?

這個時候,監(jiān)視斷點就很有用了,Visual Studio的監(jiān)視斷點就可以讓你做到在不修改程序源代碼的前提下,在調(diào)試器窗口中打印一些變量的值。

下圖演示了監(jiān)視斷點的用法:

 

設(shè)置監(jiān)視斷點的步驟,或者說是注意事項吧:

1.       設(shè)置一個普通的斷點

2.       右鍵單擊剛剛設(shè)置的斷點,在彈出菜單里面選擇“When Hit…

3.       鉤選 第一個“打印一條消息(Print a message)”復(fù)選框,輸入一串文本,默認(rèn)情況下,你輸入的文本會被直接打印到調(diào)試的輸出窗口里面來。除了:

a.       $符號開頭的幾個關(guān)鍵字。比如$FUNCTION就會被替換成斷點所在的函數(shù)名。其他有一些關(guān)鍵字在“When Breakpoints Is Hit”窗口當(dāng)中有詳細(xì)的說明。

b.      使用 大括號 {}包含起來的變量名,這樣的字符串會被替換成變量的值。

這下面就是監(jiān)視斷點的效果,注意,你只能在Visual Studio的“輸出(Output)”窗口中查看結(jié)果。

 

監(jiān)視斷點相對于日志記錄的好處是,你不需要改動源代碼,并且重新編譯代碼。實際上Visual Studio實現(xiàn)監(jiān)視斷點的原理也很簡單,就是插入一個普通的斷點,斷點觸發(fā)之后處理并且打印在“When Breakpoints Is Hit”窗口輸出的表達(dá)式,最后自動恢復(fù)程序的執(zhí)行。

NET技術(shù)Visual Studio調(diào)試之?dāng)帱c進(jìn)階篇,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 姑娘日本大全免费观看版中文翻译 | 欧美日韩一区在线观看 | 国产亚洲欧美日韩综合综合二区 | 久久天天躁狠狠躁夜夜躁 | 无套内谢大学生A片 | 中文字幕网站在线观看 | 真实伦 乱 | BLACKED太粗太长 | 嫩草欧美曰韩国产大片 | 搡女人免费免费视频观看 | 亚洲黄色在线视频 | 色WWW永久免费视频首页 | 久久精品无码一区二区日韩av | 狠狠色狠狠色综合 | 久久精品热线免费 | 亚洲人成7777 | 国产在线一区观看 | 亚洲视频在线观看不卡 | 精品久久免费观看 | 簧片高清在线观看 | 日韩人妻无码精品-专区 | 葵司中文第一次大战黑人 | 我强进了老师身体在线观看 | 亚洲日本激情 | 国产精品一区二区AV白丝在线 | 第一次玩老妇真实经历 | 亚洲婷婷天堂综合国产剧情 | 亚洲精品一区国产欧美 | 精品96在线观看影院 | 九色PORNY真实丨国产免费 | 亚洲成人免费 | 亚洲欧美国产综合在线一区 | 精品一区二区免费视频蜜桃网 | 国产51麻豆二区精品AV视频 | 美女脱了内裤张开腿让男人爽 | 二次元美女扒开内裤喷水 | 99久久国内精品成人免费 | 亚洲a视频在线观看 | 国产亚洲精品久久久闺蜜 | 色悠久久久久综合网小说 | 黄色小说在线 |