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

詳解Visual Studio調試中斷點幾個的小技巧

開發 后端
在這里我們將討論Visual Studio調試中斷點幾個的小技巧,希望對大家做好調試工作有所幫助。

斷點對于Visual Studio調試過程是十分重要的,斷點的設置也是為了更好的進行調試。本文將介紹Visual Studio調試中斷點幾個的小技巧。

一般來說,函數斷點在下面幾種情形下有用:

1 例如調試一個網站程序,你通過分析網站的日志發現最有可能發生錯誤的函數,打開調試器并將調試器附加到程序上去,設置函數斷點,重新執行網站……這樣做的好處是,不用到處打開源文件去找出錯的源代碼行,調試器會自動打開源代碼,并且在函數的入口處中斷(豈不是很方便?)。

2 例如你在閱讀源代碼的時候,通常在讀到虛函數調用的時候,因為通常這種調用都是通過基類指針調用的,而你又一時半會不知道到底有哪個繼承類的Overloading函數會被調用到,函數斷點可以告訴你。

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

4 比如你在調試Web Service函數,設置函數斷點也是一個快捷的調試方法,這個技巧跟技巧1類似。

斷點編程

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

這個時候如果調試器可以自動幫你重置lcid的值該有多好?幸運的是,Visual Studio提供了方法讓你完成這樣的工作。下面是一個簡化的代碼,因為我一時半會找不到sscli了:

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

上面的代碼在正常情況下,應該返回當前操作系統語言的lcid值,例如英文就是1033,中文的,呃……我忘記了。假設我們現在希望做的是,每當lcid的值為1033的時候,就自動更正為0。我們需要:

1 在Console.WriteLine這一行上設置一個條件斷點:

設置條件斷點  
圖1 設置條件斷點

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

  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的作用,你可以理解成在立即窗口中執行lcid = 0;這條語句。3 右鍵點擊剛才設置好的斷點,在菜單里面選擇“When Hit …”,這一次在“When Breakpoint is Hit”窗口中勾選“Run a macro:(執行一個宏)”,然后在下拉框里面選擇剛才你創建的宏的名稱。如果你是第一次創建宏,名稱應該是:Macros.MyMacros.Module1.ChangeExpression。

4 勾選“繼續執行(Continue execution)”,因為我們并不想讓程序中斷下來。

5 點擊確定以后,執行程序看一看結果,lcid是不是已經被自動改成0了?

執行結果
圖2 執行結果

數據斷點

注意,這個技巧僅對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++項目,我們以下面的源代碼為例子:

  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;  
我們現在要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的內存管理方面的文檔。

【編輯推薦】

  1. 淺析Visual Studio調試中斷點的設置
  2. 圖解VS 2010與.NET 4.0多顯示器支持
  3. VS 2010和.NET 4的多定向支持
  4. 圖解VS 2010和.NET 4起始項目模板
  5. VS 2010和.NET 4第一步:Web.config文件
責任編輯:彭凡 來源: IT168
相關推薦

2009-09-27 08:57:29

Visual Stud

2020-07-09 15:10:20

開發技能代碼

2009-12-16 15:44:20

Visual Stud

2021-08-26 05:04:53

JavaScript調試技巧

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調試

2010-12-14 09:15:50

Visual Stud

2009-09-04 09:39:15

Visual Stud

2010-04-01 15:10:06

Visual Stud

2009-04-23 14:05:28

Visual Stud歷史調試功能

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-11-23 14:32:55

Visual Stud

2009-12-04 10:35:56

Visual Stud

2009-12-03 15:58:33

Visual Stud

2017-03-02 10:30:57

AndroidAndroid Stu技巧

2010-09-01 08:35:07

Visual Stud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩淫片免费看 | 国产成人精品av | 九九久久精品视频 | 午夜三区 | 国产精彩视频一区 | 二区亚洲 | 国产精品视频一区二区三区 | 久久久123 | 97av在线| 国产一区二区三区视频 | 精品国产一区二区三区日日嗨 | 亚洲国产69 | 久久综合一区二区 | 一区二区av | 成年人在线视频 | 黄色毛片一级 | 成人福利网站 | 国产精品自产拍 | 欧美日韩手机在线观看 | 99国产精品99久久久久久粉嫩 | 日操夜操 | 国产精品99久久久久久宅男 | 亚洲一区二区三区欧美 | 影音先锋成人资源 | 在线一区二区三区 | 日韩欧美在线观看 | 少妇性l交大片免费一 | 国产一区二区在线播放 | 日韩视频国产 | 日韩欧美在线免费观看视频 | 成人高清在线视频 | 久久久久久国产免费视网址 | 国产精品视频免费观看 | 狠狠操网站| 国产色99精品9i | 成人av大全 | 欧美精品 在线观看 | av黄在线观看| 九九热re| 国产黄色麻豆视频 | 国产精品不卡一区 |