成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解Visual Studio調(diào)試中斷點(diǎn)幾個(gè)的小技巧

開(kāi)發(fā) 后端
在這里我們將討論Visual Studio調(diào)試中斷點(diǎn)幾個(gè)的小技巧,希望對(duì)大家做好調(diào)試工作有所幫助。

斷點(diǎn)對(duì)于Visual Studio調(diào)試過(guò)程是十分重要的,斷點(diǎn)的設(shè)置也是為了更好的進(jìn)行調(diào)試。本文將介紹Visual Studio調(diào)試中斷點(diǎn)幾個(gè)的小技巧。

一般來(lái)說(shuō),函數(shù)斷點(diǎn)在下面幾種情形下有用:

1 例如調(diào)試一個(gè)網(wǎng)站程序,你通過(guò)分析網(wǎng)站的日志發(fā)現(xiàn)最有可能發(fā)生錯(cuò)誤的函數(shù),打開(kāi)調(diào)試器并將調(diào)試器附加到程序上去,設(shè)置函數(shù)斷點(diǎn),重新執(zhí)行網(wǎng)站……這樣做的好處是,不用到處打開(kāi)源文件去找出錯(cuò)的源代碼行,調(diào)試器會(huì)自動(dòng)打開(kāi)源代碼,并且在函數(shù)的入口處中斷(豈不是很方便?)。

2 例如你在閱讀源代碼的時(shí)候,通常在讀到虛函數(shù)調(diào)用的時(shí)候,因?yàn)橥ǔ_@種調(diào)用都是通過(guò)基類(lèi)指針調(diào)用的,而你又一時(shí)半會(huì)不知道到底有哪個(gè)繼承類(lèi)的Overloading函數(shù)會(huì)被調(diào)用到,函數(shù)斷點(diǎn)可以告訴你。

3 或者一種特殊的情形,你想讀一個(gè)程序的源代碼,但就是找不到入口Main函數(shù),例如.NET程序,那么直接在Visual Studio里面按F11就能幫你找到入口函數(shù)—這是函數(shù)斷點(diǎn)的一個(gè)特殊情形。

4 比如你在調(diào)試Web Service函數(shù),設(shè)置函數(shù)斷點(diǎn)也是一個(gè)快捷的調(diào)試方法,這個(gè)技巧跟技巧1類(lèi)似。

斷點(diǎn)編程

有的時(shí)候你可能會(huì)碰到這種情況,觸發(fā)一個(gè)斷點(diǎn)以后,你發(fā)現(xiàn)需要修改一些值,才能使程序繼續(xù)正確執(zhí)行下去。例如我以前在中文版本的操作系統(tǒng)上,使用sscli里面(調(diào)試版)的csc.exe編譯器編譯一些包含語(yǔ)法錯(cuò)誤或者語(yǔ)法警告的C#源文件的時(shí)候,csc.exe總是會(huì)莫名其妙地報(bào)告內(nèi)部嚴(yán)重錯(cuò)誤,然后就崩潰了。我將調(diào)試器附加上去以后,發(fā)現(xiàn)是一個(gè)ASSERT錯(cuò)誤,ASSERT(lcid == 0x409),表示sscli里面的csc.exe總是默認(rèn)自己在英文操作系統(tǒng)(或者說(shuō)英文環(huán)境)里面運(yùn)行。而且這一條語(yǔ)句會(huì)被執(zhí)行很多次,手工修改lcid的值的確有點(diǎn)麻煩。然后我找源代碼找來(lái)找去都沒(méi)有找到csc.exe在哪個(gè)地方獲取到這個(gè)lcid值。

這個(gè)時(shí)候如果調(diào)試器可以自動(dòng)幫你重置lcid的值該有多好?幸運(yùn)的是,Visual Studio提供了方法讓你完成這樣的工作。下面是一個(gè)簡(jiǎn)化的代碼,因?yàn)槲乙粫r(shí)半會(huì)找不到sscli了:

  1. int lcid = System.Globalization.CultureInfo.CurrentUICulture.LCID;  
  2. Console.WriteLine("lcid = {0}", lcid); 

上面的代碼在正常情況下,應(yīng)該返回當(dāng)前操作系統(tǒng)語(yǔ)言的lcid值,例如英文就是1033,中文的,呃……我忘記了。假設(shè)我們現(xiàn)在希望做的是,每當(dāng)lcid的值為1033的時(shí)候,就自動(dòng)更正為0。我們需要:

1 在Console.WriteLine這一行上設(shè)置一個(gè)條件斷點(diǎn):

設(shè)置條件斷點(diǎn)  
圖1 設(shè)置條件斷點(diǎn)

2 點(diǎn)擊Visual Studio菜單欄里面的“工具(Tools)”—“宏(Macro)”—“宏資源管理器(Macro Explorer)”。然后創(chuàng)建一個(gè)新的宏:

  1. Imports System  
  2. Imports EnvDTE  
  3. Imports EnvDTE80  
  4. Imports EnvDTE90  
  5. Imports System.Diagnostics  
  6. Imports Microsoft.VisualBasic  
  7. Imports Microsoft.VisualBasic.ControlChars  
  8. Public Module Module1  
  9.     Sub ChangeExpression()  
  10.         DTE.Debugger.ExecuteStatement("lcid = 0;")  
  11.     End Sub  
  12. End Module 

上面DTE.Debugger.ExecuteStatement的作用,你可以理解成在立即窗口中執(zhí)行l(wèi)cid = 0;這條語(yǔ)句。3 右鍵點(diǎn)擊剛才設(shè)置好的斷點(diǎn),在菜單里面選擇“When Hit …”,這一次在“When Breakpoint is Hit”窗口中勾選“Run a macro:(執(zhí)行一個(gè)宏)”,然后在下拉框里面選擇剛才你創(chuàng)建的宏的名稱(chēng)。如果你是第一次創(chuàng)建宏,名稱(chēng)應(yīng)該是:Macros.MyMacros.Module1.ChangeExpression。

4 勾選“繼續(xù)執(zhí)行(Continue execution)”,因?yàn)槲覀儾⒉幌胱尦绦蛑袛嘞聛?lái)。

5 點(diǎn)擊確定以后,執(zhí)行程序看一看結(jié)果,lcid是不是已經(jīng)被自動(dòng)改成0了?

執(zhí)行結(jié)果
圖2 執(zhí)行結(jié)果

數(shù)據(jù)斷點(diǎn)

注意,這個(gè)技巧僅對(duì)C++程序調(diào)試有效(或者說(shuō)native程序),而且你只能在中斷模式下才能設(shè)置數(shù)據(jù)斷點(diǎn),另外你還只能在本機(jī)設(shè)置數(shù)據(jù)斷點(diǎn)。

上一節(jié)的例子里,我們提到了,有的時(shí)候一個(gè)全局變量被修改了以后,你可能都找不到它是什么時(shí)候被修改的,于是夜已深,人已寐,你還在辛苦地調(diào)試到底是哪個(gè)鬼地方把這個(gè)變量的值修改了。F11, F10,……,SHIFT + F11,……,F(xiàn)5,靠,調(diào)過(guò)了,重來(lái),F(xiàn)11,F(xiàn)10,……

這種情況下,數(shù)據(jù)斷點(diǎn)就很有用了,Visual Studio允許你在變量被修改的時(shí)候,中斷程序的執(zhí)行,是不是很酷?

默認(rèn)情況下,你是找不到數(shù)據(jù)斷點(diǎn)這個(gè)菜單的,需要執(zhí)行下面的步驟把它拉出來(lái):

1 打開(kāi)你要調(diào)試的項(xiàng)目。

2 點(diǎn)擊Visual Studio菜單欄里面的“工具(Tools)”—“自定義(Customize…)”。然后在“自定義(Customize…)”窗口中選擇“命令(Commands)”頁(yè)簽里面的“種類(lèi)(Categories)”列表框里的“調(diào)試(Debug)”,找到“新數(shù)據(jù)斷點(diǎn)(New Data Breakpoint)”,將它拖到菜單欄里面相應(yīng)的位置。

然后打開(kāi)或者創(chuàng)建一個(gè)C++項(xiàng)目,我們以下面的源代碼為例子:

  1. #include "stdafx.h"  
  2. int g_Variable = 0;  
  3. int _tmain(int argc, _TCHAR* argv[])  
  4. {  
  5.        printf("Before modifying data breakpoints"n");  
  6.        g_Variable = 1;  
  7.        printf("After modifying data breakpoints"n");  
  8.        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)是通過(guò)監(jiān)視內(nèi)存地址某一段區(qū)域更改來(lái)實(shí)現(xiàn)的,因此你必須提供一個(gè)內(nèi)存地址(或者說(shuō)就是指針吧),這里g_Variable是一個(gè)整形變量,因此你需要使用“&g_Variable”的形式來(lái)創(chuàng)建一個(gè)數(shù)據(jù)斷點(diǎn),因?yàn)檎蔚?大小是4個(gè)字節(jié),因此數(shù)據(jù)斷點(diǎn)監(jiān)視的區(qū)域是4個(gè)字節(jié)。 

斷點(diǎn)監(jiān)視區(qū)域
圖3 斷點(diǎn)監(jiān)視區(qū)域
 

3 繼續(xù)程序的執(zhí)行,這時(shí)會(huì)彈出一個(gè)對(duì)話(huà)框,告訴你有一個(gè)內(nèi)存地址的內(nèi)容發(fā)生了變化(說(shuō)明我們的數(shù)據(jù)斷點(diǎn)生效了),這時(shí)代碼行指向的是數(shù)據(jù)被修改的下一行代碼。

運(yùn)行提示
圖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)存管理方面的文檔。

【編輯推薦】

  1. 淺析Visual Studio調(diào)試中斷點(diǎn)的設(shè)置
  2. 圖解VS 2010與.NET 4.0多顯示器支持
  3. VS 2010和.NET 4的多定向支持
  4. 圖解VS 2010和.NET 4起始項(xiàng)目模板
  5. VS 2010和.NET 4第一步:Web.config文件
責(zé)任編輯:彭凡 來(lái)源: IT168
相關(guān)推薦

2009-09-27 08:57:29

Visual Stud

2020-07-09 15:10:20

開(kāi)發(fā)技能代碼

2009-12-16 15:44:20

Visual Stud

2021-08-26 05:04:53

JavaScript調(diào)試技巧

2009-10-14 09:08:23

Visual Stud

2009-11-30 15:21:38

Visual Stud

2011-04-02 08:39:27

Visual Stud

2017-04-18 09:27:14

Visual StudNode.js調(diào)試

2010-12-14 09:15:50

Visual Stud

2010-04-01 15:10:06

Visual Stud

2009-09-04 09:39:15

Visual Stud

2009-04-23 14:05:28

Visual Stud歷史調(diào)試功能

2013-08-01 15:12:03

Visual Stud

2015-02-04 10:32:57

Objective-CSwift

2009-07-31 16:23:00

linux cd命令cd命令技巧

2009-12-03 15:58:33

Visual Stud

2009-11-23 14:32:55

Visual Stud

2009-12-04 10:35:56

Visual Stud

2010-09-01 08:35:07

Visual Stud

2017-03-02 10:30:57

AndroidAndroid Stu技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区高清 | 亚洲网站在线播放 | 亚洲va欧美va天堂v国产综合 | 亚洲国产精品久久 | 久久99国产精品久久99果冻传媒 | 国产一区二区三区欧美 | 视频一区中文字幕 | 日韩在线观看一区二区三区 | 久久久91 | 国产一级黄色网 | 欧美一级电影免费观看 | 韩国精品一区二区三区 | 成人做爰www免费看视频网站 | 亚洲精品91| 国产乱码精品1区2区3区 | 欧美精品福利 | 亚洲第一黄色网 | 91久久综合亚洲鲁鲁五月天 | 秋霞在线一区二区 | 狠狠亚洲| 91精品国产综合久久久亚洲 | 亚洲精品成人av | 精品久久久精品 | 欧美中文在线 | 日本黄色片免费在线观看 | 黄色免费在线观看网址 | 欧美一级欧美三级在线观看 | 国产一区二区三区四 | 久久av网站| 免费在线观看一区二区 | 日本精品久久久久久久 | 欧美区精品 | 国产日韩欧美中文 | 一区二区三区四区五区在线视频 | 国产视频一区二区 | 欧美一区二区三区在线观看 | 精品中文字幕在线 | 国产特一级黄色片 | 免费黄色大片 | 欧美高清一区 | 国产精品一区二区久久 |