首頁 資料庫 mysql教程 Visual Studio的调试技巧

Visual Studio的调试技巧

Jun 07, 2016 pm 03:41 PM
studio v visual 關於 技巧 偵錯

这是我写的关于VS2010和.Net4发布的博客系列的第26篇。 今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友 Scott Cate (他写了很多很好的关于VS使用技巧和窍门的 博客 )最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(

这是我写的关于VS2010和.Net4发布的博客系列的第26篇。

今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(即使他们大部分都在产品开发组呆过一阵子)。 如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们。 它们学起来很容易,能帮你节省很多时间。

运行到光标(Ctrl+ F10)

我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码前设置一个断点,然后反复的敲F10/F11来逐步通过代码,直到到达他们真正想要研究的确切位置。有些时候他们需要仔细观察所跨过的每行代码,这样使用F10/F11 就很合理。 但是更普遍的是,他们只想快点进入他们真正关心的那行代码——这是使用F10/F11 就不是最好的选择了。

相反, 你可能想利用调试器支持的特性“运行到光标”。 只需简单地把你的光标放在代码中你想程序运行到的那一行,然后同时敲Ctrl+F10。这样程序就会运行到光标所在的那一行, 然后执行中止,由调试器控制——这样就节约了你反复敲击F10/F11到达那里的时间。即使你想运行到的那行代码不在当前调试的方法或类里,而是在一个独立的方法或类里,这也同样奏效。

条件断点

我们经常在可用性学习中见到另一个普遍的技巧:开发人员设置断点,运行程序,试着输入一些数据,当到达一个断点时,手工检查某种条件是不是成立,如果成立才决定进一步研究。 如果条件不符合他们想要的, 按F5继续执行程序,尝试另外一些输入,再手工重复同样的过程。

VS的条件断点功能提供了一个更加容易的方法来处理以上情况。 条件断点允许你只在某种明确指定的条件成立时才中止执行,由调试器控制。这帮你免于手动检查/恢复你的程序, 使得整个调试过程免去许多手工活,也不那么冗长乏味。

设置一个条件断点

设置一个条件断点十分简单,在代码里按F9为某一行设置一个断点:

Visual Studio的调试技巧

然后右击断点——编辑器左边的红色圆圈,在右键菜单中,选择“条件…” :

Visual Studio的调试技巧

将弹出以下对话框, 允许你指明某种条件,只有当这种条件成立时,断点才能达到。 例如:我们可以通过写下面的表达式来指明,只有当paginatedDinners列表元素的个数小于10时,才中止程序,由调试器控制。

Visual Studio的调试技巧

现在, 当我重新运行程序来研究一下, 调试器只在这个查找返回值小于10时,才中止程序执行。 如果返回值不小于10 ,将不会触发断点。

命中次数功能

有时你只想在条件第N次成立时中止执行。例如:仅当第5次出现查找返回值小于10时,才中止执行。你这样启用这个功能:右击断点, 选择“命中次数…”菜单命令。

Visual Studio的调试技巧

将弹出以下对话框, 允许你指明程序中断的条件:条件被第N次满足时,或者条件被满足的次数是N的倍数时,或者条件被满足的次数大于等于N次时。

Visual Studio的调试技巧

机器/线程/进程筛选器

你可以右击断点,选择“筛选器…”菜单命令, 来指明断点只在某台特定的机器,或某个特定的进程或线程中才能被触发。

跟踪点——当击中断点时自定义行为

很多人不知道的一个调试功能是使用跟踪点。 跟踪点是一个断点, 当它被击中时,某种自定义的宏会被触发执行。当你想研究你的应用程序而又不想中止执行程序时, 这个功能特别有用。

我将用一个简单的控制台程序来演示如何使用跟踪点。 下面是斐波那契数列的递归实现:

Visual Studio的调试技巧

在上面的应用程序中,针对特定的输入,我们使用Console.WriteLine()来输出最后的斐波那契数列。假如我们想在调试过程中研究斐波那契的递归过程——而不停止调试的执行? 跟踪点能帮我们很轻松地做到这一点。

设置跟踪点

你可以这样启用跟踪点:按F9在代码上设置一个断点, 右击断点,在右键菜单中选择“命中条件…”菜单命令:

Visual Studio的调试技巧

将弹出以下对话框——允许你指定当断点触发时,进行何种操作:

Visual Studio的调试技巧

如上所示,我们指定每次当断点的条件成立时,打印跟踪信息。注意我们指定了想要输出的局部变量“X” 的值作为输出信息的一部分。 局部变量能通过{变量名}的语法被引用。 也有内嵌的命令(像$CALLER,$CALLSTACK, $FUNCTION等等)可以用来输出跟踪信息中常见的值。

上面对话框的底部, 我们也选中了“继续执行”单选框——表示我们不希望调试器暂停程序。 相反,程序会继续执行——只是我们自定义的跟踪信息会在每次断点条件满足时输出,就这点不同。

现在当我们运行程序时,我们会发现自定义的跟踪信息会自动出现在VS的输出窗口中——使我们能看到程序的递归过程。

Visual Studio的调试技巧

你也可以选择为你的程序设置一个自定义跟踪监听器——这样跟踪点的输出信息就会被重定向到它里面,而不是VS的输出窗口里。

跟踪点——运行自定义的宏

上周我在伦敦做了一次演讲, 听众中有个人问了这样一个问题:有没有可能当击中一个跟踪点时,自动输出所有的局部变量。

这个功能不是内置在VS中的, 但是可以通过在VS中写一个自定义的宏来启用它,然后设置一个跟踪点,当它被击中时,调用这个宏。 为了实现这个目的, 打开VS中的宏窗口(工具->宏->宏菜单命令)。然后在项目管理器“MyMacros”结点下面, 选择模板或者新建一个模板(如:添加一个名为“UsefulThings”的 模板), 再将下面的VB宏代码贴到模板里,并保存它:

<span>   1:</span> <span>Sub</span> DumpLocals()
登入後複製
<span>   2:</span>  
登入後複製
<span>   3:</span> <span>Dim</span> outputWindow <span>As</span> EnvDTE.OutputWindow
登入後複製
<span>   4:</span>  
登入後複製
<span>   5:</span>        outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).<span>Object</span>
登入後複製
<span>   6:</span>  
登入後複製
<span>   7:</span> <span>Dim</span> currentStackFrame <span>As</span> EnvDTE.StackFrame
登入後複製
<span>   8:</span>  
登入後複製
<span>   9:</span>        currentStackFrame = DTE.Debugger.CurrentStackFrame
登入後複製
<span>  10:</span>  
登入後複製
<span>  11:</span>        outputWindow.ActivePane.OutputString(<span>"*Dumping Local Variables*"</span> + vbCrLf)
登入後複製
<span>  12:</span>  
登入後複製
<span>  13:</span> <span>For</span> <span>Each</span> exp <span>As</span> EnvDTE.Expression <span>In</span> currentStackFrame.Locals
登入後複製
<span>  14:</span>  
登入後複製
<span>  15:</span>            outputWindow.ActivePane.OutputString(exp.Name + <span>" = "</span> + exp.Value.ToString() + vbCrLf)
登入後複製
<span>  16:</span>  
登入後複製
<span>  17:</span> <span>Next</span>
登入後複製
<span>  18:</span>  
登入後複製
<span>  19:</span> <span>End</span> <span>Sub</span>
登入後複製

上面的宏代码依次检测当前堆栈,获取所有的局部变量,并将其显示在输出窗口。

使用DumpLocals自定义宏

在下面这个简单的应用程序中,我们可以利用自定义的“DumpLocals”宏:

Visual Studio的调试技巧

在上面的Add方法的return语句上,按F9设置一个断点。 右击断点,选择“命中条件…”菜单命令:

Visual Studio的调试技巧

将弹出以下对话框,上例中,我们选中了“打印信息”的单选框,再手工指定希望输出的变量, 而这里, 我们选中“运行宏”的单选框,使它指向我们创建的自定义宏UsefulThings.DumpLocals:

Visual Studio的调试技巧

我们仍然选中“继续执行”单选框,这样能保证当跟踪点被击中时,程序依然能够继续执行。

运行程序

现在当我们按F5运行程序,当调用Add方法时,我们将看见以下输出出现在VS输出窗口中。 注意当跟踪点被击中时,宏是如何自动列出各个变量名及其值的。

Visual Studio的调试技巧

总结

VS调试器功能非常丰富。 我强烈建议大家抽出一些时间来学习它的所有功能。 以上的技巧和诀窍只是很多大家没有真正意识到的功能中的一小部分。

我之前写过其他一些关于VS2010调试器改进的博客

也请务必看看Scott Cate很棒的VS2010技巧和诀窍系列,你可以学习如何更好的利用VS。他有一些非常棒的免费视频和博客。

也要看看Jim Griesmer很棒的VS调试技巧和诀窍系列。 他有许多很好的可以利用的技巧和诀窍。

希望这能对您有所帮助。

Scott



原文:http://weblogs.asp.net/scottgu/archive/2010/08/18/debugging-tips-with-visual-studio-2010.aspx

中文翻译:http://blogs.msdn.com/b/scottgu/archive/2011/10/08/visual-studio.aspx?wa=wsignin1.0

Visual Studio的调试技巧


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C++ 函式偵錯詳解:如何偵錯多執行緒函數中的問題? C++ 函式偵錯詳解:如何偵錯多執行緒函數中的問題? May 02, 2024 pm 04:15 PM

C++ 函式偵錯詳解:如何偵錯多執行緒函數中的問題?

如何使用LeakSanitizer調試C++記憶體洩漏? 如何使用LeakSanitizer調試C++記憶體洩漏? Jun 02, 2024 pm 09:46 PM

如何使用LeakSanitizer調試C++記憶體洩漏?

golang 函數調試和分析的捷徑 golang 函數調試和分析的捷徑 May 06, 2024 pm 10:42 PM

golang 函數調試和分析的捷徑

Java 並發程式設計如何進行並發測試與除錯? Java 並發程式設計如何進行並發測試與除錯? May 09, 2024 am 09:33 AM

Java 並發程式設計如何進行並發測試與除錯?

PHP 偵錯錯誤:常見錯誤的指南 PHP 偵錯錯誤:常見錯誤的指南 Jun 05, 2024 pm 03:18 PM

PHP 偵錯錯誤:常見錯誤的指南

如何調試 PHP 非同步程式碼 如何調試 PHP 非同步程式碼 May 31, 2024 am 09:08 AM

如何調試 PHP 非同步程式碼

C++ 函式偵錯詳解:如何除錯包含異常處理的函式中的問題? C++ 函式偵錯詳解:如何除錯包含異常處理的函式中的問題? Apr 30, 2024 pm 01:36 PM

C++ 函式偵錯詳解:如何除錯包含異常處理的函式中的問題?

Java函數中遞歸呼叫的調試技巧有哪些? Java函數中遞歸呼叫的調試技巧有哪些? May 05, 2024 am 10:48 AM

Java函數中遞歸呼叫的調試技巧有哪些?

See all articles