VS调试技巧

VS调试中经常使用断点、堆栈窗口,很少使用监视、快速监视窗口和即时命令窗口。查找了相关资料后发现监视窗口在某些情况下还是很有用的,所以针对上述窗口大体总结了一下;
一、监视窗口的使用
1.添加监视变量
程序执行过程中命中断点后,
a. 在变量名称位置单击右键,“添加监视”;
b. 将变量选中,拖动 到监视窗口;
c. 在监视列表中双击,编辑要监视的变量名称;
2. 监视中查看、修改变量当前值
a. 若监视的变量为数值,则可选择数值展示的进制格式:1) 单击右键,选择"以x进制展示"; 1) 通过"变量名称,格式字符"的方式切换展示方式,如下图。图中a变量的当前值为0xabc,"a,d"是以十进制方式展示;"a,x"是以十六进制小写展示。vs支持多种格式字符,详细说明见如下链接:
https://msdn.microsoft.com/zh-cn/library/75w45ekt.aspx
数值格式化显式
b. 双击变量值,可做编辑修改,修改后的变量如图标红高亮显式。MSDN上对于标红高亮的解释如下:

为什么在“局部变量”窗口和“自动”窗口中变量值有时是红色的?
你可能注意到,在“局部变量”和“自动”窗口中一个变量的值有时是红色的。 这些是自上次评估以来更改过的变量值。 此更改可能是在上一次调试会话中进行的,或者是因为在窗口中更改了该值。

3.计算表达式的值
在监视窗口中可对当前作用域中的可见变量计算相关表达式的值:
a. 变量加减或取址
这里写图片描述
b.函数或接口调用
接口调用时,值这一列对应为函数调用的返回值,若无返回值则为void
这里写图片描述
c.查看地址对应的符号信息
调试中需要查看某些地址位置对应的符号,可以添加到监视窗口,默认地址值以数值方式展示。若明确知道该地址为某一类型变量的地址,则可以将对地址做强制地址转换,输入如下表达式:(CSomeType*)0x000aefee。然后就可以看到该地址对应内存中的内容。若不知道其实际类型,可尝试使用"void*"做强制转换以明确告诉调试器,该值为内存地址值,调试器会尝试做符号解析。测试中发现void*强转仅对编译期生成的静态符号,如函数,静态变量等能够准确匹配,堆或栈上分配的数据变量无法匹配(静态变量定义后需要有访问、使用,否则编译器会将其优化掉,导致监视时找不到该变量)。如下图:
这里写图片描述
二、断点调试的使用
断点是程序调试中的必备技能,VS提供了多种类型的断点,有普通断点、数据断点和函数断点。大体说一下这三类断点的使用方式:

  1. 普通断点
    程序启动后,在指定代码位置添加的断点,待程序执行到断点位置后自动暂停。值得一提的,普通断点的使用也有小技巧,即指定断点命中的条件(条件断点)或断点命中时输出特定信息,不暂停程序运行(操作断点)。
    a. 条件断点
    断点上右击中选择条件,弹出如下面板,面板中可指定命中断点的条件,断点仅在条件匹配时暂停程序执行。条件表达式可以是当前作用域内的所有可访问变量的取值判断判断。在断点位置频繁执行,逐次命中断点查看变量值效率极低,此时条件断点最能发挥其作用。 在这里插入图片描述
    b. 操作断点
    操作断点,即断点命中时执行特定操作,通常时输出可访问变量的值到输出窗口,叹号图标引用变量的说明。在消息回调中,一次业务流有连续的多个消息上报,排查消息上报的时序或状态是否正确就可采用操作断点。操作结束后,输出中一次查看所有输出的消息值即可快速验证回调消息的正确性。
    在这里插入图片描述
  1. 数据断点
    调试中时常碰到因某个标记变量错误导致执行过程错乱,如何快速定位标记为赋值点成为定位问题的关键。数据断点就是针对某个内存地址的取值变化而定义的一类断点,可在取值变化时命中断点。内存地址只有在程序运行时才能够获取,所以该断点要结合普通断点一起使用,在普通断点命中后,通过监视窗口查看地址值或变量取地址表达式获取地址值,都可用于数据断点的设置。
    在这里插入图片描述
  2. 函数断点
    顾名思义就是针对函数标记符的断点,该断点在与符号匹配的函数调用时命中。典型场景,如程序中使用了某个界面库,该界面库提供了一个消息提示接口,很好用,程序中上千处错误提示的地方都在调,突然某一天冒出一个不知何处来的提示,要定位出错原因怎么办?接口在库里面,代码打断点肯定是不行了。此时函数断点可派上用场,指定断点位置为库中该接口,在消息再次出现命中断点,通过调用堆栈就能够找到调用位置,简直不要太方便。提示一下,函数名输入时不要忘记命名空间。在这里插入图片描述在这里插入图片描述
    断点很好用,但是也要注意,断点要及时删除或禁用,程序运行中断点太多会导致调试卡顿,尤其是数据断点和函数断点,有时候单步调试单步执行都要卡一下,不妨把断点清一下。当然,线程调试窗口也可以关一下,调试器要随时跟踪大量线程堆栈也是很耗性能的。

另外,对于监视窗口的使用,CodeProject有篇文章总结的很好,推荐读一下:

https://www.codeproject.com/articles/121623/10-tips-you-should-know-about-watch-window-while-d

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值