Visual Studio的調試技巧

Visual Studio的調試技巧

【原文地址】?Debugging Tips with Visual Studio 2010

【原文發表日期】 2010/8/19 10:48 AM

?

這是我寫的關于VS2010和.Net4發布的博客系列的第26篇。

今天的博文包含了一些有用的能用于VS的調試技巧。 我的朋友?Scott Cate(他寫了很多很好的關于VS使用技巧和竅門的?博客)最近向我強調了這些很好的技巧,大部分使用VS的開發人員好像不知道這些技巧(即使他們大部分都在產品開發組呆過一陣子)。 如果你還沒有使用過這些技巧,希望這篇博文能幫你發現它們。 它們學起來很容易,能幫你節省很多時間。

運行到光標(Ctrl+ F10)

我經常看見人們是這樣來調試應用程序的: 他們在應用程序需要調試的代碼前設置一個斷點,然后反復的敲F10/F11來逐步通過代碼,直到到達他們真正想要研究的確切位置。有些時候他們需要仔細觀察所跨過的每行代碼,這樣使用F10/F11 就很合理。 但是更普遍的是,他們只想快點進入他們真正關心的那行代碼——這是使用F10/F11 就不是最好的選擇了。

相反, 你可能想利用調試器支持的特性“運行到光標”。 只需簡單地把你的光標放在代碼中你想程序運行到的那一行,然后同時敲Ctrl+F10。這樣程序就會運行到光標所在的那一行, 然后執行中止,由調試器控制——這樣就節約了你反復敲擊F10/F11到達那里的時間。即使你想運行到的那行代碼不在當前調試的方法或類里,而是在一個獨立的方法或類里,這也同樣奏效。

條件斷點

我們經常在可用性學習中見到另一個普遍的技巧:開發人員設置斷點,運行程序,試著輸入一些數據,當到達一個斷點時,手工檢查某種條件是不是成立,如果成立才決定進一步研究。 如果條件不符合他們想要的, 按F5繼續執行程序,嘗試另外一些輸入,再手工重復同樣的過程。

VS的條件斷點功能提供了一個更加容易的方法來處理以上情況。 條件斷點允許你只在某種明確指定的條件成立時才中止執行,由調試器控制。這幫你免于手動檢查/恢復你的程序, 使得整個調試過程免去許多手工活,也不那么冗長乏味。

設置一個條件斷點

設置一個條件斷點十分簡單,在代碼里按F9為某一行設置一個斷點:

然后右擊斷點——編輯器左邊的紅色圓圈,在右鍵菜單中,選擇“條件…” :

將彈出以下對話框, 允許你指明某種條件,只有當這種條件成立時,斷點才能達到。 例如:我們可以通過寫下面的表達式來指明,只有當paginatedDinners列表元素的個數小于10時,才中止程序,由調試器控制。

現在, 當我重新運行程序來研究一下, 調試器只在這個查找返回值小于10時,才中止程序執行。 如果返回值不小于10 ,將不會觸發斷點。

命中次數功能

有時你只想在條件第N次成立時中止執行。例如:僅當第5次出現查找返回值小于10時,才中止執行。你這樣啟用這個功能:右擊斷點, 選擇“命中次數…”菜單命令。

將彈出以下對話框, 允許你指明程序中斷的條件:條件被第N次滿足時,或者條件被滿足的次數是N的倍數時,或者條件被滿足的次數大于等于N次時。

機器/線程/進程篩選器

你可以右擊斷點,選擇“篩選器…”菜單命令, 來指明斷點只在某臺特定的機器,或某個特定的進程或線程中才能被觸發。

跟蹤點——當擊中斷點時自定義行為

很多人不知道的一個調試功能是使用?跟蹤點。 跟蹤點是一個斷點, 當它被擊中時,某種自定義的宏會被觸發執行。當你想研究你的應用程序而又不想中止執行程序時, 這個功能特別有用。

我將用一個簡單的控制臺程序來演示如何使用跟蹤點。 下面是?斐波那契數列的遞歸實現:

在上面的應用程序中,針對特定的輸入,我們使用Console.WriteLine()來輸出最后的斐波那契數列。假如我們想在調試過程中研究斐波那契的遞歸過程——而不停止調試的執行? 跟蹤點能幫我們很輕松地做到這一點。

設置跟蹤點

你可以這樣啟用跟蹤點:按F9在代碼上設置一個斷點, 右擊斷點,在右鍵菜單中選擇“命中條件…”菜單命令:

將彈出以下對話框——允許你指定當斷點觸發時,進行何種操作:

如上所示,我們指定每次當斷點的條件成立時,打印跟蹤信息。注意我們指定了想要輸出的局部變量“X” 的值作為輸出信息的一部分。 局部變量能通過{變量名}的語法被引用。 也有內嵌的命令(像$CALLER,$CALLSTACK, $FUNCTION等等)可以用來輸出跟蹤信息中常見的值。

上面對話框的底部, 我們也選中了“繼續執行”單選框——表示我們不希望調試器暫停程序。 相反,程序會繼續執行——只是我們自定義的跟蹤信息會在每次斷點條件滿足時輸出,就這點不同。

現在當我們運行程序時,我們會發現自定義的跟蹤信息會自動出現在VS的輸出窗口中——使我們能看到程序的遞歸過程。

你也可以選擇為你的程序設置一個自定義跟蹤監聽器——這樣跟蹤點的輸出信息就會被重定向到它里面,而不是VS的輸出窗口里。

跟蹤點——運行自定義的宏

上周我在倫敦做了一次演講, 聽眾中有個人問了這樣一個問題:有沒有可能當擊中一個跟蹤點時,自動輸出所有的局部變量。

這個功能不是內置在VS中的, 但是可以通過在VS中寫一個自定義的宏來啟用它,然后設置一個跟蹤點,當它被擊中時,調用這個宏。 為了實現這個目的, 打開VS中的宏窗口(工具->宏->宏菜單命令)。然后在項目管理器“MyMacros”結點下面, 選擇模板或者新建一個模板(如:添加一個名為“UsefulThings”的 模板), 再將下面的VB宏代碼貼到模板里,并保存它:

Sub DumpLocals()

Dim outputWindow As EnvDTE.OutputWindow

??????? outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object

Dim currentStackFrame As EnvDTE.StackFrame

??????? currentStackFrame = DTE.Debugger.CurrentStackFrame

??????? outputWindow.ActivePane.OutputString("*Dumping Local Variables*" + vbCrLf)

For Each exp As EnvDTE.Expression In currentStackFrame.Locals

??????????? outputWindow.ActivePane.OutputString(exp.Name + " = " + exp.Value.ToString() + vbCrLf)

Next

End Sub

上面的宏代碼依次檢測當前堆棧,獲取所有的局部變量,并將其顯示在輸出窗口。

使用DumpLocals自定義宏

在下面這個簡單的應用程序中,我們可以利用自定義的“DumpLocals”宏:

在上面的Add方法的return語句上,按F9設置一個斷點。 右擊斷點,選擇“命中條件…”菜單命令:

將彈出以下對話框,上例中,我們選中了“打印信息”的單選框,再手工指定希望輸出的變量, 而這里, 我們選中“運行宏”的單選框,使它指向我們創建的自定義宏UsefulThings.DumpLocals:

我們仍然選中“繼續執行”單選框,這樣能保證當跟蹤點被擊中時,程序依然能夠繼續執行。

運行程序

現在當我們按F5運行程序,當調用Add方法時,我們將看見以下輸出出現在VS輸出窗口中。 注意當跟蹤點被擊中時,宏是如何自動列出各個變量名及其值的。

總結

VS調試器功能非常豐富。 我強烈建議大家抽出一些時間來學習它的所有功能。 以上的技巧和訣竅只是很多大家沒有真正意識到的功能中的一小部分。

我之前寫過其他一些?關于VS2010調試器改進的博客(包括數據標簽固定,斷點導入導出,保留最后值變量, 等等)。 我將發表更多關于VS2010的智能跟蹤和轉儲文件調試支持的博文。這些技術提供了很多非常酷的新功能,會讓程序(包括產品中的程序)的調試變得非常簡單和強大。

也請務必看看Scott Cate很棒的?VS2010技巧和訣竅系列,你可以學習如何更好的利用VS。他有一些非常棒的免費視頻和博客。

也要看看Jim Griesmer很棒的?VS調試技巧和訣竅系列。 他有許多很好的可以利用的技巧和訣竅。

希望這能對您有所幫助。

Scott

轉載于:https://www.cnblogs.com/yymn/p/5341945.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272052.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讀者寫者問題

河北科技大學操作系統課程設計——讀者寫者問題 #include <windows.h> #include <conio.h> #include <stdlib.h> #include <fstream> #include <io.h> #include <string.h> #include <stdio.h> using namespace std; #define READE…

Linux排序命令sort筆記

很多時候Linux需要對文本相對比較規范的文本數據進行排序&#xff0c;這時候可以使用Linux系統下的sort命令進行處理。語法格式&#xff1a;sort [-ntkr] filename常用參數&#xff1a;-n 根據數字進行排序-t 指定的分隔符-k 指定分隔符的第幾列-r 降序排序用法示例&#xff1a…

《過早退出是一切失敗的根源》讀后感

在看完周筠老師的文章&#xff1a;過早的退出是一切失敗的根源&#xff0c;內心感觸頗大。因為年輕&#xff0c;我們總覺得有許許多多的另一個與下一次&#xff0c;我們總是在某個環境里失敗或覺得不行時&#xff0c;就會想退出&#xff0c;我們對有風險的事情不愿去嘗試&#…

redirect路由配置 vue_Web前端:Vue路由進階配置

大家好&#xff0c;我來了&#xff0c;本期為大家帶來的前端開發知識是”Web前端&#xff1a;Vue路由進階配置“&#xff0c;有興趣做前端的朋友&#xff0c;和我一起來看看吧&#xff01;1. 頁面打開權限流程頁面是否能打開有以下兩點判斷&#xff1a;1. 判斷是否增加登陸的判…

ESP8266模塊無限重啟崩潰的問題

問題背景&#xff1a; 最近使用ESP8266模塊&#xff08;NodeMCU&#xff09;在Arduino環境下進行開發調試時遇到了一個ESP8266模塊無限重啟崩潰的問題。這個問題不是第一次發生了&#xff0c;很久之前遇到了后面也不知道怎么解決了。 這一次再次碰到了&#xff0c;經過查閱網上…

python格式化輸出

格式化輸出字符串 格式化輸出整數 格式化輸出浮點數 輸出&

Linux常用內建命令筆記

Linux系統為了便于運維人員對系統的操作&#xff0c;所以內建了很多shell命令。一般來說linux系統的內建命令會比執行外部的shell命令執行更快。因為執行內建命令相當于調用當前shell進程里面的函數&#xff0c;而執行外部命令的話需要出發IO操作還要fork一個單獨的進程來執行&…

什么原因接觸接觸impala的

最近一個項目&#xff0c;關于大數據的改造項目&#xff0c;底層選擇Impala還是sparkSQL呢&#xff1f; 最后選擇Impala.這樣就開啟了我的Impala學習之旅。我大部分負責Imapa接口開發工作。 我是控制不住的想整個都了解和學習。所有還在impala控制臺各種測試和學習。差不多一兩…

asp手機拍照顯示_會員動態飛凱材料120噸TFTLCD混合液晶顯示項目,建后五年達產...

來源 &#xff1a;全景網10月26日&#xff0c;在飛凱材料可轉債發行網上路演會議上&#xff0c;該公司相關人員也對投資者關心的問題進行解答。關于發行8.25億元可轉換債券&#xff0c;飛凱材料表示本次募集資金扣除發行費用后將用于投資以下項目&#xff1a;10000t/a紫外固化光…

python中變量的命名和關鍵字和變量的命名規則

[False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield]

Linux中Shell數組的筆記

Shell數組的介紹數組算是一種特殊的數據結構&#xff0c;數據項可以成為數組的元素&#xff0c;可以通過數組的索引獲取每一個數組的元素值。數組的典型的使用場景是把相同類型的元素匯總在一起。由于Shell變量屬于弱類型&#xff0c;所以數組里面的元素并不一定是相同類型。注…

linux中php配置

安裝nginxphp好久了&#xff0c;今天意外的搭建好了&#xff0c;分享給大家 &#xff0c;以免以后多走彎路。 nginx已經前面安裝好了&#xff0c;現在就開始配置php 安裝php 分為兩個部分 &#xff1a;一部分是php源碼&#xff0c;另外是fastcgi管理進程&#xff1a;php-fpm 慶…

log函數 oracle power_Excel之數學函數SQRT/MOD/EXP/LN/RAND

本部分主要包括ABS函數、SQRT函數、SIGN函數、MOD函數、POWER、EXP函數、LN函數、LOG函數、LOG10函數、RAND函數、RANDBETWEEN函數、PI函數、SIN函數、COS函數、TAN函數、PRODUCT函數、FACT函數、GCD函數、LCM函數、DEGREES函數、RADIANS函數和SUBTOTAL函數共22個。需重點掌握S…

Linux中Shell循環結構for用法筆記

Shell中可以使用for做固定次數循環的處理。常見的for循環用法主要有以下幾種&#xff1a;1、帶列表的for循環語法結構&#xff1a;for item in (list)docommanddone示例&#xff1a;cat demo1.sh 內容如下&#xff1a;#!/bin/bashnames"小明 小王 小張"for item in n…

斐波那契數列 在實際問題上的變種

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形&#xff0c;總共有多少種方法1 利用數組結構遍歷方法if(target1 || target0)return 1;int [] arr new int [target1];arr[0] 1;arr[1] 1;for(int i2;i<target;i){a…

焊接符號標注圖解示例_【干貨】焊接圖紙符號匯總 ,學習收藏!!

基本坡口符號坡口符號(注&#xff1a;圖中“破”應為“坡”)焊接圖紙符號標注圖解示例焊接符號標注實例及方法在焊接結構圖樣上&#xff0c;焊接方法可按國家標準GB5185-85的規定用阿拉伯效字表示&#xff0c;標注在指引線的尾部。常用焊接方法代號見表3-9所示。如果是組合焊接…

Linux有關Shell中if用法筆記

shell中的if主要是用于程序的判斷邏輯&#xff0c;從而控制腳本的執行邏輯。這和很多編程語言思路上都是一致的。1、if的用法結構如下&#xff1a;if exp;thencommand1;command2;fi示例&#xff1a;#根據輸入的學生成績打印對應的成績等級&#xff1a;大于90分為優秀&#xff1…

自定義Chrome插件Vimium

自定義快捷鍵 map e scrollPageUp map w removeTab map s nextTab map a previousTab map q goNext map z restoreTab 默認搜索引擎 https://www.baidu.com/s?wd 添加上一頁下一頁識別 Previous patterns prev,previous,back,older,<,←,,?,<<,上一頁 Next patterns…