Visual Studio的調試技巧

Visual Studio的調試技巧

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

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

【轉自】 http://msdn.microsoft.com/zh-cn/gg213858

 

這是我寫的關於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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章