VS2010中的调试技巧

2023-05-16

 今天的博文将介绍Visual Studio中的一些实用调试技巧。这是受我朋友Scott Cate (他发表过几十篇很棒的VS技术文章) 启发。他最近告诉我,许多Visual Studio下的程序员,甚至一些很有经验的开发人员,都不知道这些技巧。希望这篇文章能帮你掌握这些技巧。它们都很简单,却能帮你节约大量的时间。

  跳到当前光标处(Ctrl+F10)

  我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按F10/F11,一步步走到目标代码处。当程序员的确需要仔细观察每一步的状态变化时, F10/F11是合理的选择。然而多数情况下,人们只想快速到达他们真正关心的代码处,这时候F10/F11就不是最佳选择了。

  这时,你应该利用“跳到当前光标处”这个功能。先把光标定位在要测的目标代码行上,再同时按Ctrl和F10,被测程序将直接跳到该行停下。你再也不用按许多次F10/F11了。即使目标代码位于独立的类或方法中,你仍然可以从当前正在检查的地方跳过去。

  条件中断

  另一种常见的情况是:开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。

  针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。

  如何设置条件断点

  设置条件断点非常容易。在特定的行上,按F9设置断点。

  然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“Condition…”。

  这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当局部变量paginatedDinners的尺寸小于10时,调试才中断。我们可以写出如下的表达式:

  现在我再运行这个程序,实现搜索,只有返回值小于10时,程序运行才会被中断。对于大于10的值,该断点将被跳过。

  记录到达断点次数

  有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第五次返回少于10份晚餐的查询结果时,中断程序运行。
可以通过右击断点,然后在弹出菜单上选择“Hit count…”菜单命令实现。

  这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。

  机器/线程/进程过滤

  设置如下:右击断点;在弹出菜单上选择“Filter…”菜单命令;然后指定命中断点的特定条件:在指定的机器上、或指定的进程中、或指定的线程中。

  跟踪点—进入断点时的自定义操作

  许多人不知道“跟踪点(TrackPoints)”这个调试功能。“跟踪点“是种特殊的断点,当它被命中时,它会触发一系列自定义操作。如果你想观察程序的行为,而又不想中断调试的时候,这个功能尤其有用。

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

  以上程序中,我们使用Console.WriteLine() 输出针对特定输入值生成的最终斐波那契数列。如果希望在调试器里观察操作中每一次递归运算后的数列而又不实际中断程序运行,该怎么办呢?“跟踪点”可以轻松实现。

  设置跟踪点

  你可以在特定的行上,按F9加跟踪点。然后
右击断点,在上下文菜单中选择“When Hit…”:

  在弹出对话框上,你可以设置命中该断点时,所触发的事件。

  在上面例子中,我们设定一旦命中断点时就打印追踪信息。注意,我们已经把局部变量“x”的值,作为追踪信息的一部分输出。局部变量可以通过{变量名}语法输出。你还可以利用系统内置的命令($CALLER, $CALLSTACK, $FUNCTION等等),在追踪信息中输出常用的调试值。

  在上例中,我们同时选中了底端的“continue execution“选项,这说明我们不希望程序中断调试状态,而是继续运行。唯一的不同是:每次断点条件满足时,我们的自定义追踪信息都将被输出。

  现在当我们运行程序时,会发现自定义追踪信息自动显示在Visual Studio的“输出“窗口里。这让我们很容易看到程序的递归调用过程:

  你也可以选择往应用程序中添加一个自定义追踪信息的监听器。这时追踪点的输出信息将通过它输出,而不是Visual Studio的“输出“窗口。

  跟踪点—运行自定义的宏

  上周,我在伦敦演讲时,有听众问道:当命中跟踪点时,能否自动输出所有的局部变量?

  Visual Studio中并没有这样的内置功能,但我们可以写一个自定义宏来实现,然后在命中跟踪点时调用该宏。这个的实现需要先打开Visual Studio的宏编辑器(工具->宏->宏IDE菜单命令),然后在项目资源管理器的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”宏了:

  上述代码中,我们用F9在“Add”方法的返回值处加了个断点,然后右击断点,在弹出菜单上选择“When hit”。

  将显示如下对话框。和之前不一样, 我们不选“Print a message”选项,也不手工设定需要输出的变量;而是选择“Run a marco”复选框,并指定到我们上面创建的UsefulThings.DumpLocals宏上:

  为了使程序能在命中跟踪点后仍继续运行,我们将继续选中“continue execution”复选框。

  运行程序

  现在按F5运行程序,当“Add”方法被调用时,我们会在Visual Studio的“输出”窗口中看到如下结果。注意命中跟踪点时,宏会自动列出每个局部变量的名称和值:

  总结

  Visual Studio的调试程序功能极其丰富,我强烈建议大家花些时间去掌握它的所有功能。上述技巧是大家平时很少注意的那些功能中的一小部分。

  我之前写过关于VS 2010 调试器改进的博文(包括固定数据提示窗、导入/导出断点、保留上次变量的值,等等)。以后我还会发表更多关于VS 2010的新智能提示和文件调试信息的转储支持的博文。这些技术赋予开发人员强大的调试能力,使调试程序(包括发行后的产品)变得更容易,更强大。

  如果想学习更多Visual Studio知识,请参考Scott Cate的Visual Studio 2010知识与技巧系列。他发表了一系列精彩的免费视频和文章。

  也可以参考 Jim Griesmer的Visual Studio调试技巧系列。他有着丰富的知识可供大家学习。

  希望对大家有帮助。

转载于:https://blog.51cto.com/kebin/506847

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2010中的调试技巧 的相关文章

随机推荐

  • 离线快速部署Mirantis Openstack 9.0

    Mirantis Openstack 9 0 简称为MOS 9 0 它 是 Mirantis 公司开发 openstack 自动化安装工具 xff0c 这个工具还有个专门的名字 xff0c 叫做 Fuel 离线安装时不需要更新Ubuntu和
  • 浅析人脸检测之Haar分类器方法

    补充 这是我时隔差不多两年后 回来编辑这篇文章加的这段补充 说实话看到这么多评论很是惊讶 有很多评论不是我不想回复 真的是时间久了 很多细节我都忘记了 无力回复 非常抱歉 我本人并非做CV的 这两年也都没有再接触CV 作为一个本科毕业的苦逼
  • Debian下如何进入图形界面

    在进行基本安装之后 xff0c 如果没有选择图形界面的话 xff0c 是不会进入图形界面的 xff0c 如果想要进入图形界面就必须要安装x window系统 xff0c 如果没有该系统就更别谈什么KDE和 GNOME了 xff0c 因为它们
  • RHEL5.5部署iscsi连接,开机自动启动

    最近要部署linux服务器连接iscsi服务器 xff0c 挂载iscsi盘 xff0c 记录下操作步骤 iscsi target是EMC的低端存储 xff0c IP xff1a 192 168 10 59 iscsi initiator安
  • ONIE

    http www onie org https github com opencomputeproject onie
  • 首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 分割 技术交流群 后台回复 分割综述 获取语义分割 实例分割 全景分割 弱监督分割等超全学习资料 xff01 摘要 用于视
  • 记录com.google.code.maven-replacer-plugin找不到文件

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一直猜想是打包阶段的问题 xff0c 找了好久找到这个 xff1a https blog gkishorapps rhcloud com 2014 05 removing
  • 解决vnc灰屏,黑屏,鼠标大黑叉情况

    解决 linux 上 VNC 安装好后登录出现黑屏 灰屏 鼠标是大黑叉情况 安装系统支持包组 服务器 xff08 Centos rhel xff09 在安装字符界面操作系统时默认是不会安装相关图形包组的 yumgroupinstall 34
  • Incorrect datetime value

    今天在开发库上给一个表添加字段时候 xff0c 发现居然报错 root 64 DB 06 14 42 gt ALTER TABLE 96 DB 96 96 user 96 ADD COLUMN 96 status mode 96 TINYI
  • 5个最佳免费Linux杀毒软件

    Linux的防病毒软件 xff0c 开玩笑吧 xff1f Linux不是很安全吗 xff1f 很多Linux新手都这样认为 xff0c 看到标题不要犹豫 xff0c 读完全文你就会从中找到答案 首先 xff0c Linux比其它操作系统更稳
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程

    Mac 鼠须管 Rime 输入法 安装五笔输入法 教程 相关链接 极点五笔方案 github xff1a https github com KyleBing r RIME 官网 xff1a https rime im RIME github
  • MapReduce实现与自定义词典文件基于hanLP的中文分词详解

    前言 xff1a 文本分类任务的第 1步 xff0c 就是对语料进行分词 在单机模式下 xff0c 可以选择python jieba分词 xff0c 使用起来较方便 但是如果希望在Hadoop集群上通过mapreduce程序来进行分词 xf
  • 单点登录-CAS登录流程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 第1 2两个章节摘抄自http www cnblogs com lihuidu p 6495247 html xff0c 第3部分来源于CAS官网 1 从项目部署结构说起
  • Hadoop集群(第5期)_Hadoop安装配置

    1 集群部署介绍 1 1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 以Hadoop分布式文件系统 xff08 HDFS xff0c Hadoop Distributed Filesystem xff
  • 服务器系统没有界面,云服务器没有图形界面

    云服务器没有图形界面 内容精选 换一换 使用鲲鹏弹性云服务器 没有图形界面 操作某些文件的时候 你一定需要一个好用的编辑器 那么神器vim就得必须说说啦 超级好用先看图 vim有很多快捷操作 但是对于新人来说 仅仅用于日常修改文件部分信息
  • ERROR 1129 (HY000): Host '192.168.7.210' is blocked because of many connection errors; unblock with ...

    一 问题现象 mysql远程连接报错 ERROR 1129 HY000 Host 39 192 168 7 210 39 is blocked because of many connection errors unblock with 3
  • 大裕量Softmax 损失函数--Large-Margin Softmax Loss for Convolutional Neural Networks

    ICML2016 Large Margin Softmax Loss for Convolutional Neural Networks 本文针对CNN网络中的 Softmax Loss 做出改进 xff0c 使之成为 Large Marg
  • Deep Learning 学习笔记(一)——softmax Regression

    Deep Learning 学习笔记 xff08 一 xff09 softmax Regression 茫然中不知道该做什么 xff0c 更看不到希望 偶然看到coursera上有Andrew Ng教授的机器学习课程以及他UFLDL上的深度
  • Debian 从稳定版升级到测试版

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 关于Debian 的发行版本 Debian 一直维护着至少三个发行版 稳定版 stable xff0c 测试版 testing 和 不稳定版 unstable 稳定版
  • VS2010中的调试技巧

    今天的博文将介绍Visual Studio中的一些实用调试技巧 这是受我朋友Scott Cate 他发表过几十篇很棒的VS技术文章 启发 他最近告诉我 xff0c 许多Visual Studio下的程序员 xff0c 甚至一些很有经验的开发