摘要: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次时。
机器/线程/行程筛选器
你可以右击中断点,选择“筛选器…”菜单命令, 来指明中断点只在某台特定的机器,或某个特定的行程或线程中才能被触发。
跟踪点——当击中中断点时自订行为
很多人不知道的一个侦错功能是使用跟踪点。 跟踪点是一个中断点, 当它被击中时,某种自订的宏会被触发执行。当你想研究你的应用程序而又不想中止执行程序时, 这个功能特别有用。
我将用一个简单的控制面板程序来Demo如何使用跟踪点。 下面是斐波那契数列的递归实现:
在上面的应用程序中,针对特定的输入,我们使用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侦错技巧和诀窍系列。 他有许多很好的可以利用的技巧和诀窍。
希望这能对您有所帮助。
附:[除了写博客以外,我现在也使用推特(Twitter)来及时更新状态和分享连结,您可以到这个位址“推”我一下:twitter.com/scottgu]
原文地址:https://www.cnblogs.com/chinatrump/p/11496785.html