11个强大的Visual Studio调试小技巧

2023-11-15

伯乐在线注:我们在@程序员的那些事 微博上推荐了英文原文,感谢@halftone_被禁用了 的热心翻译。

简介

调试是软件开发周期中很重要的一部分。它具有挑战性,同时也很让人疑惑和烦恼。总的来说,对于稍大一点的程序,调试是不可避免的。最近几年,调试工具的发展让很多调试任务变的越来越简单和省时。

这篇文章总结了可能节省你大量时间的11个Visual studio的调试技巧和方法。

1 悬停鼠标查看表达式值

1. Hover mouse to evaluate expression

调试是很有挑战性的。比如在函数内逐步运行可以看出哪里出错,查看堆栈信息可以知道函数被谁调用等等……但是无论哪种情况下,查看表达式和局部变量的值都是很麻烦的(把表达式和局部变量放到watch窗口里)。一种更简单的方法,把鼠标停在所需查看的数据上。如果是类或结构,那么点击展开可以很方便快速地查看其字段。

 

2 在运行过程中改变变量值

2. Change values on-the-fly

调试器不仅仅是分析程序崩溃和诡异行为的工具,还可以通过逐步调试检查数据和行为是否符合程序预期的方法解决许多bug。有时,你会想是否设置某些条件为真,程序就能正确运行了。其实你只要把鼠标移动到变量上,双击值,然后输入你需要的值。这样就不需要修改代码,重启程序了。

 

3 设置下一个运行位置

3. Set next statement

一个典型的调试案例是我们经常会用逐步调试的方法去分析为什么函数出错了。这时你遇到这个函数调用其他函数返回错误,而这个错误不是你想要的,你该怎么办?重启调试器?这里有个更好的方法,直接把黄色的运行位置箭头拖到你想要的运行位置。其实就是跳过中间运行代码,直接到想要的位置。很简单吧。

 

4 编辑然后继续运行

4. Edit and continue

在运行一个很复杂的程序和插件时,发现一个错误,但是不想浪费时间去重编译重启动程序。很简单,只要在这个位置修改这个bug,然后继续调试。Visual studio会修改这个程序,使得你可以继续调试而不需要重启程序。

值得注意的是“编辑然后继续运行”这个功能有几个限制。一,它不能在64位代码上使用。如果想使用这个功能,到项目设置里的编译选项,选择”x86”作为目标平台。不要担心,这目标平台在reslease配置是和”debug是分离的,也就是说依然是”Any CPU”的设置。二,“编辑然后继续运行”这个功能仅适用于一个函数内部改变。如果你想要改变这个函数的声明或者增加新的方法,你只能选择重启程序,或者不做任何改变继续。如果修改的方法中包含lambda表达式,则意味着修改了编译器自动生成的委托类型,这样会导致编译器停止运行。

 

5 一个方便的查看窗口

5. A convenient watch window

大部分现代的调试器都有查看窗口。但是,visual studio的查看窗口使用特别简单,你能很方便的增加和删除变量。只要在窗口里点击空白行,输入表达式然后按enter键。或者点击表达式,按delete键删除不需要的表达式。

在调试窗口不仅仅可以查看普通的变量值,甚至可以输入$handles去追踪打开的句柄数量,$err去查看函数的错误代码(然后使用 Tools->Error 查看错误代码的描述)或者输入 @eax(在64位下是@rax )查看包含函数返回值的寄存器值。

 

6 注释反汇编

6. Annotated disassembly

使用内部的反汇编功能使得优化局部代码更加简单。Visual studio可以在你的每一行代码下显示汇编指令,并且可以逐步调试汇编代码,也可以在任意位置设置断点。查看和修改汇编代码类似于c++。

 

7 堆栈信息的线程窗口

7. Threads window with stacks

调试多线程代码是很痛苦的。或许也是有趣的。这取决于你的调试器。Visual studio 一个很赞的功能就是在线程窗口查看线程的堆栈信息。你能很方便的直接看到所有线程以及他们的堆栈信息。

 

8 条件断点

8. Conditional breakpoints

如果你想重现一个小概率事件,但是断点在大量不需要的条件下也会触发。你可以很简单的设置条件断点。在断点窗口设置该断点条件,Visual studio 会自动忽略不符合条件的断点。

 

9 内存窗口

9. Memory window

一些bug是由错误的结构定义、缺少对齐属性等原因引起的。查看每行内存的内容很容易定位和解决这些bug. Visual studio 的内存窗口可以把数据翻译成8/16/32/64-bit数字或者浮点数。你可以在编辑窗口直接改变数值。

 

10 跳转到定义

10. Go To Definition

如果你在解决别人写的代码一个bug,会遇到“这个类型是什么”“这个函数做什么的”之类的问题,你可以使用visual studio的跳转到定义的命令来查看类型或函数的定义。

 

11 命令窗口

11. Command Window

这个小技巧是由chaau建议的,它能节省你大量的时间。Visual studio支持一个命令窗口,你可以通过菜单View->Other Windows->Command Window 打开。你可以在窗口里输入不同命令使调试自动化。比如,可以通过很简单的命令去的测试MFC的COleDateTime变量。

1
? dt.Format( "%Y-%m-%d %H:%M:%S" )

 

英文原文:Ivan Shcherbakov,编译:@halftone_被禁用了

译文链接:http://blog.jobbole.com/33865/

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

11个强大的Visual Studio调试小技巧 的相关文章

  • 【yolo】yolov5-seg实例分割标签

    文章目录 前言 yolo标签 yolov5 seg标签 转换代码 前言 不同于以往的yolo数据 用的是目标框的label 再加上语义标签 yolov5 seg中用的标签只有一个语义标签 没有目标框的标签 具体对比如下 yolo标签 1 目

随机推荐

  • java 获取月份 几周_java – 我想在特定的月份获得几周的时间

    Calendar类的WEEK OF YEAR属性可能对您有用 参考 Calendar class 创建一个新的日期 将是一个月的第一天 得到这一天的一周的这个星期 让你说起点价值 创建一个新的日期 这将是给定月份的最后一天 获得今年的一周
  • FastCFS核心组件FastStore架构及特点

    FastCFS核心组件FastStore架构及特点 本篇文章转载于 FastCFS 作者 余庆 大佬的 FastDFS分享与交流 公众号 上一篇文章介绍了 FastCFS 服务端两大核心组件 FastDIR 和 FastStore 其中 F
  • python文本数据处理_Python文本数据分析与处理

    Python文本数据分析与处理 新闻摘要 分词 使用jieba分词 注意lcut只接受字符串 过滤停用词 TF IDF得到摘要信息或者使用LDA主题模型 TF IDF有两种 jieba analyse extract tags conten
  • Linux中su、su -和sudo的区别

    su 切换到root用户 但是并没有转到root用户家目录下 即没有改变用户的环境 su 切换到root用户 并转到root用户的家目录下 即改变到了root用户的环境 这个涉及到不同用户下的环境变量的配置 sudo 通过sudo 我们能把
  • 【C++】迭代器

    目录 1 迭代器 1 1 迭代器的操作 1 2 迭代器范围 1 3 使用左闭合范围蕴含的编程假定 2 begin和end成员 3 容器操作可能使迭代器失效 3 1 迭代器失效 3 2 编写改变容器的循环程序 3 3 不要保存end返回的迭代
  • (1)分类算法

    分类算法原理 一 KNN K 近邻 1 定义 如果待推测点 空心点 在中间的某个位置 则计算出与其最邻近的4个样本点 K 4 而此时这4个样本点包含了3个类别 1红 1蓝 2绿 针对这样的情况 knn算法通常采用投票法来进行类别推测 即找出
  • 安装VMware Tools方法(对于 18.04LTS版本)

    大家都知道 每一种虚拟机 如VMware Parallels Desktop等都有一个Tools用来让linux系统和windows系统可以共用剪贴板等工具 使得在windows上复制了的东西 在linux ubuntu 上可以访问 对于V
  • MQ知识梳理

    常见MQ有哪几种 分别适用什么场景 常见的有ActiveMQ RabbitMQ RocketMQ Kafka ActiveMQ比较成熟 功能多 但也比较老 各方面都不突出 目前已很少使用 RabbitMQ性能高 功能多 吞度量万级 有开源活
  • C#中的接口(interface)

    接口的命名规范 I 名词 接口与抽象类的区别 接口是由抽象类演变而来的 抽象类是未完全实现逻辑的类 其内部可以有抽象成员 也可以有非抽象成员 且子类在覆写抽象成员时 需要修饰符override 而接口是完全未实现逻辑的 其内部只允许存在抽象
  • java报错:com.alibaba.druid.pool.DruidDataSource.info {dataSource-1} inited

    JDBC使用Druid连接池连接数据库的时候 遇到报错 com alibaba druid pool DruidDataSource info dataSource 1 inited 具体报错信息如下 从网页上报错信息 可以看到是获取驱动名
  • 彻底理解vue底层运用的核心函数Object.defineProperty

    一个函数诞生一个框架 vue就是得益于javaScrit的原生函数Object defineProperty而诞生的 那么Object defineProperty到底是什么 它的用法又是怎样的呢 很简单 它就是用来为对象定义属性的 从字面
  • 51单片机串口通信数码管显示

    外部晶振 11 0592MHZ 主控芯片 STC89C52 程序功能 串口工作方式1 8位UART 比特率9600 接收串口数据 数码管以十 进制格式显示 并且把接收到的数据加1后通过串口发出
  • 【Idea】创建包自动分层

    Idea 创建包自动分层 创建Maven 项目时 新建包使得Tomcat查找访问路径时更准确 但是有时包会不分层 如图1 然后我们使用图3的方法取消勾选 使得新建包时自动分层 如图2
  • 华为机试--简单题(一)

    HJ14 字符串排序 知识点 字符串 排序 描述 给定 n 个字符串 请对 n 个字符串按照字典序排列 数据范围 1 n 1000 字符串长度满足1 len 100 输入描述 输入第一行为一个正整数n 1 n 1000 下面n行为n个字符串
  • JAVA基于Slack实现异常日志报警

    一 功能介绍 在我们日常开发中 如果系统在线上环境上 发生异常 开发人员不能及时知晓来修复 可能会造成重大的损失 因此后端服务中加入异常报警的功能是十分必要的 而开发一个功能全面的异常报警服务 可能会花费较长的周期 今天给大家带来一种基于S
  • STM32F407基于RT-Thread连接ESP8266WiFi模块

    1 连接规则 STM32F4连接ESP8266无线通信 串口通信 首先 本次用到两个串口 我使用的是普中STM32F407 第一个串口为USART1 PA2 PA3 串口一 就是数据线连接单片机和电脑时用的口 串口三USART3 PB10T
  • 当面试官问你离职原因的时候怎么回答比较好?

    所有的前提都是建立在有一定的物质基础 当你的一日三餐都成了问题 都需要家庭支持的时候我希望你可以找一份工作 靠自己的本事养活自己从来不丢人 我觉得死要面子活受罪才是真的让你看不起 所有的建议都是建立在我们是普通打工人的前提 大佬是不需要建议
  • C++:二维数组--输出斐波那契数列的前20项

    大家都知道 在数学世界中有很多神奇的数列 斐波那契数列正是众多有规律的数列中的一种 该数列是意大利数学家列昂纳多 斐波那契发现的 他的基本规律是从第三项开始 每一项都等于前两项之和 第一项和第二项都是1 斐波那契数列如下图所示 1 1 2
  • http概述

    目录 概述 Web客户端和服务器 资源 http如何通信 媒体类型 URI 事务 方法 状态码 报文 连接 版本历程 Web的结构组件 代理 缓存 网关 隧道 Agent代理 爬虫 概述 HTTP是现代全球因特网中使用的公共语言 web浏览
  • 11个强大的Visual Studio调试小技巧

    伯乐在线注 我们在 程序员的那些事 微博上推荐了英文原文 感谢 halftone 被禁用了 的热心翻译 简介 调试是软件开发周期中很重要的一部分 它具有挑战性 同时也很让人疑惑和烦恼 总的来说 对于稍大一点的程序 调试是不可避免的 最近几年