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次时。

机器/线程/行程筛选器

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

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

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

我将用一个简单的控制面板程序来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]

原文:大专栏  Visual Studio的侦错技巧

原文地址:https://www.cnblogs.com/chinatrump/p/11496785.html

时间: 2024-11-08 18:12:44

Visual Studio的侦错技巧的相关文章

Visual Studio调试之断点技巧篇补遗

原文链接地址:http://blog.csdn.net/Donjuan/article/details/4649372 讲完Visual Studio调试之断点技巧篇以后,翻翻以前看得一些资料和自己写的一些文章,发现还有几个关于中断程序的技巧在前面的文章里面遗漏了,决定还是在这里总结一下.当然啦,如果你知道这些技巧,忽略这篇文章好了,:) 在程序启动的时候将调试器附加上去 可能有人会对这个问题有一些争议,因为大部分情况下我们只需要在调试器(Debugger)里面直接启动被调试程序(Debugge

Visual Studio调试之断点技巧篇

原文链接地址:http://blog.csdn.net/Donjuan/article/details/4618717 函数断点 在前面的文章Visual Studio调试之避免单步跟踪调试模式里面我讲了如何设置函数断点,说实话,我个人喜欢设置函数断点,而不是在代码行里面设置断点.一般来说,函数断点在下面几种情形下有用: 1. 例如调试一个网站程序,你通过分析网站的日志发现最有可能发生错误的函数,打开调试器并将调试器附加到程序上去,设置函数断点,重新执行网站--这样做的好处是,不用到处打开源文件

could not connect to the debugger --Visual Studio Emulator报错解决方法

在Android项目上右击选择属性--Android选项: 把使用快速部署(仅调试模式)勾选取消掉: 之后打开hyper-V管理器,选择自己的那个虚拟机右击设置--处理器--兼容性--勾选迁移到具有不同处理器版本的物理计算机:(如果灰色无法勾选,先关掉你的emulator模拟器)==应用: 再次重启emulator即可:

启动Visual Studio 2010报错

错误内容: 外接程序"VMDebugger"未能加载或导致了异常. 是否希望移除该外接程序? 错误号: 80004005 如下图: 解决办法一: 1. 点击 是 打开VS2010,(点否按照下面的修改无效) 然后右键点 VMware. 选择自定义, 下图: 2. 删除VMware项. 然后点击关闭. 重启VS2010后. 问题解决, 且VMware会重新出现 解决方法二: 1. 修改注册表: HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftV

Visual Studio Code:使用技巧汇总

造冰箱的大熊猫@cnblogs 2019/8/9 1.跳转到指定行号:Ctrl+g 2.跳转到特定函数.变量声明:Ctrl+Shift+O 原文地址:https://www.cnblogs.com/pandabang/p/11326469.html

使用VS GDB扩充套件在VS上远端侦错Linux上的C/C++程序

在 Linux 上开发 C/C++ 程序,或许你会直接(本机或远端)登入 Linux,打开编辑器写完代码后,就用 gcc/g++ 来编译,遇到要除错(debug)的时候,则会选择使用 gdb 来进行除错.现在,如果你刚好也很喜欢 Visual Studio,你可以不必改变习惯,用 Visual Studio写程式.然后远端送到 Linux 上编译.甚至还能接上 gdb 来除错.这个对于开发像是嵌入式系统.或是 IoT 装置的程序等等就可以多多利用 Visual Studio 强大的 IDE 能力

Visual Studio原生开发的10个调试技巧(一)

最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧: 异常中断 | Break on Exception Watch窗口中的伪变量 |

Visual Studio 2008常见问题

1.asp.net在什么软件上运行?学习asp往往需要测试asp程序,电脑不能直接测试,需要装IIS才能运行,但装IIS要么需要安装盘,要么需要安装包,而且设置也很复搜索杂.这里给大学推荐两个替代IIS的工具.Nlife.rar和NetBox.rar测试方法把主程序放到需要测试的文件的目录中,双击程序就自动运行,这时就不用管它了.在浏览器中输入: http://localhost 或 http://127.0.0.1就会进入该目录中,点击文件就可测试.下载地址: Nlife.rar 下载地址 h

当 Visual Studio 扩展遇到错误时

我是遇到了 Github 扩展经常在 Visual Studio 启动时报错,找了一下可以尝试以下方法: 首先卸载插件 然后删除 %LocalAppData%\Microsoft\VisualStudio\15.0_{some ID}\privateregistry.bin 和 privateregistry.user.bin 两个文件 然后再安装插件 应该就好了- 另外报错时多阅读错误日志,从错误日志中寻找错误原因来解决. 原文:https://developercommunity.visua