前言

我在上一篇文章????《5 个非常实用的 vs 调试技巧》 中分享了 5 个我认为非常值得了解的 vs 调试技巧,本周继续分享 5 个很基础但同样实用的调试技巧。

1. 条件断点

作用简介:

顾名思义,带条件的断点。满足条件才中断。条件断点非常非常有用,使用得当,可以极大缩短我们调试问题的时间。比如,有一个大循环,只在第 1024 次循环的时候有问题,我们如果单步(在 vs 中可以按 F10),恐怕手得按残了。又比如,我们想在特定条件下中断。这时候条件断点就是我们的救星。

2. 内存断点

作用简介:

顾名思义,针对内存设置的断点。对于调试逻辑复(hun)杂(luan)的程序,非常非常有用。比如,有一个全局变量的值,在代码中有 N 个地方会改动它,在调试程序的时候,不知道这个全局变量在哪里被改变了,如果能在改动的那一刻中断下来该有多好啊!这可是内存断点的专长!

打开方式:

调试的时候,通过 调试 -> 窗口 -> 断点 即可打开断点窗口。在 vs2013 中对应的快捷键是 ctrl + alt + b 。打开后可以 通过 新建 -> 新建数据访问断点(D)... 创建一个数据访问断点。

注意:

  1. 只有在程序中断到调试器的时候才允许新建数据访问断点。

  2. 输入的是内存地址,可以直接输入地址值,也可以通过 & 获取地址。

  3. vs 好像只支持指定的内存范围的值发生变化时才中断。windbg 中的 ba 命令更强大,感兴趣的小伙伴儿可以查看 windbg 的帮助文档。

3. 异常开关

作用简介:

异常最多分发两轮,每轮都会优先分发给调试器。如果调试器没处理,会继续分发给异常处理函数。具体的分发过程可以参考《软件调试》。

比如,在下面的示例代码中。我在 ExceptionDemo() 中加上了 try {} catch {}  来捕获一些异常。在 FunctionE() 中的某一行设置好断点,如果一切正常是可以断下来的。但是在 FunctionD() 中有可能抛出异常,如果根据设置,vs 不处理这个异常,该异常会被 ExceptionDemo() 处理,还没运行到设置断点的地方就被异常改变了执行流程。

#include "stdafx.h"
#include <exception>bool application_quit = false;
int g_runningLoop = 0;void FunctionA();
void FunctionB();
void FunctionC();
void FunctionD();
void FunctionE();void ExceptionDemo()
{try{while (!application_quit){FunctionA();}}catch (std::exception){}
}void FunctionA() { FunctionB(); }
void FunctionB() { FunctionC(); }
void FunctionC() { FunctionD(); }
void FunctionD()
{if (++g_runningLoop > 6){throw std::exception("too many loops!");}FunctionE();
}void FunctionE()
{if (g_runningLoop > 10){application_quit = true;}
}

p.s. 虽然在代码中增加 try {} catch {} 有助于提高程序的健壮性,但有时候可能不利于我们发现问题,有些问题可能就被“默默”吞掉了。

打开方式:

调试的时候,通过 调试 -> 异常(X)... 即可打开异常设置对话框。在 vs2013 中对应的快捷键是 Ctrl + Alt + E

注意:只有在调试的时候才能设置,不调试的时候是看不到异常设置菜单的。

4. 调试时修改值

作用简介:

假设我们正在调试如下代码,跟踪到了 if (bRich) 这一行,期待的 bRich 的值是 true,而实际值是 false。我们可以手动修改 bRich 的值为 true 来强行进入 if 分支,而不是 else 分支。(BTW,改完就真的有钱了么?)

#include "stdafx.h"
#include <iostream>bool HaveIMakeEnoughMoney()
{return false;
}void ManualModifyValueDemo()
{auto bRich = HaveIMakeEnoughMoney();if (bRich){std::cout << "Finally, I'm rich!" << std::endl;}else{std::cout << "Oops, I'm still poor!" << std::endl;}}

小贴士:不仅可以通过悬浮窗口改变变量的值,我们还可以通过监视窗口内存窗口等其它方式改变变量的值。

5. 拖动到指定位置执行

作用简介:

相信,大家都有过手滑的情况,本来想的是单步步入(在 vs 中按 F11)特定函数,没想到却按成了 F10,华丽丽的错过了想调试的函数,这时候我们可以拖回来。又或者如上面的代码,当执行到第24行的时候,发现 totalMoney 的值不是我们想要的,我们想重新回到前面跟踪一下totalMoney 的值是怎么来的,而我们又不想重新走一遍整个流程(因为可能很慢)。这时候我们可以手动拖动黄色小箭头到第 22 行。

注意:

拖动功能是通过设置 eip(rip) 的值来实现的,拖动需谨慎,有些情况下可能导致程序崩溃!

测试工程下载地址

百度云盘 链接: https://pan.baidu.com/s/1MSjUNPF-JHoY1t3l1xXFeg 提取码: jew2

CSDN:https://download.csdn.net/download/xiaoyanilw/12640122

总结

本次介绍的 5 个调试技巧虽然都很基础,但是却非常实用,而且使用频率比较高。不知道你是否有所收获呢?

参考资料

《软件调试》

欢迎留言交流!

感谢你的赞和在看

继续分享 5 个实用的 vs 调试技巧相关推荐

  1. 办公技巧:分享12个实用的word小技巧,欢迎收藏!

    今天给大家分享12个实用的word小技巧,希望对大家能有所帮助! 1. Word表格自动填充序号 在Word表格里选中要填入相同内容的单元格,单击"格式→项目符号和编号",进入&q ...

  2. 分享9个实用的电脑维修技巧,赶紧收藏吧!

    今天给大家分享9个实用的电脑维修技巧,赶紧收藏吧! 01.电脑不能上网 常见原因1:新装系统无驱动 解决方法:需要下载驱动进行安装,可以先从其他设备下载拷贝到U盘安装. 常见原因2:DNS服务器 解决 ...

  3. 这10个实用的Javascript调试技巧,你知道吗?

    见过太多同学调试Javascript只会用简单的console.log甚至alert,看着真为他们着急.因为大多数同学追求优雅而高效地写代码,却忽略了如何优雅而高效地调试代码,不得不说是有点" ...

  4. 分享两个实用的PPT制作技巧

    不知道大家是否关注过vivo的发布会?在这种发布会上,除了留意手机等信息的新发布,也可以留意大厂的PPT制作效果哦.让其PPT吸引你的部分变成自己的改进部分吧. 1.使用推送动画在页面之间创建连续性 ...

  5. java8中stream最实用总结和调试技巧

    文章目录 背景 stream介绍 1. 什么是流? 2. 流的构成 3.流的操作类型 stream使用 1. 流的构造与转换 2. 流的操作 在idea中如何调试stream 总结 背景 java8推 ...

  6. 分享一个非常实用的视频剪辑技巧

    很多刚开始学习剪辑的宝贝们,虽然有素材在手,但却不知道如何高效剪辑好视频,于是乎,今天小编给大家安利一个新的剪辑技巧,下面一起来试试,希望能给大家带来帮助. 流畅的剪辑过程 第一步,粗剪,把有关的视频 ...

  7. 再分享 5 个 vs 调试技巧

    前言 之前在<5 个非常实用的 vs 调试技巧>和<继续分享 5 个实用的 vs 调试技巧>中分享了 10 个我认为非常值得了解的 vs 调试技巧,本周继续分享 5 个很实用的 ...

  8. 邮件营销有效吗?分享几个实用的电子邮件营销策略和技巧!

    (一)什么是电子邮件营销,它从什么时候开始的? 1971 年,Ray Tomlinson根据来源发送了世界上第一封电子邮件,标志着现代通信时代的开始.这条信息没什么特别的,一串数字和字母,看起来更像是 ...

  9. 工具:分享IntelliJ IDEA 5条调试技巧,太实用了!

    一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可 ...

最新文章

  1. Win7/Win2008下IIS配置Asp站点启用父路径的设置方法
  2. Android实现左右滑动效果
  3. Science:穿梭于个体大脑与群体大脑之间探索社会智能
  4. Linux查看历史信息代码,使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录
  5. 手机浏览器推荐_推荐一款手机上最好用的浏览器
  6. 【Flask】jinja2过滤器的使用
  7. 麻省理工学院(MIT)的公开课程
  8. php新手用7.2,总结PHP升级7.2之后需要注意的事情
  9. timeSetEvent、回调函数、CCriticalSection
  10. .class和getClass()的区别
  11. hdu 1559 最大子矩阵 (简单dp)
  12. scala helloworld
  13. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了
  14. NFS, web,负载均衡,Nginx yum 源码安装
  15. python和java还有sql区别_人人都在学编程?Python,R,Java,SQL,你究竟需要学哪一种?...
  16. 使用.pk8 和.pem签名生成.keystore 签名
  17. multisim红绿灯元器件在哪里_实验一:Multisim交通灯仿真.ppt
  18. SEI文献整理2:A Review of Radio Frequency Fingerprinting Techniques(2020)
  19. 元音I、i 、ε、æ、a小总结
  20. 计算机在日常办公众的应用论文,计算机及应用基础专业论文.docx

热门文章

  1. linux下svn常用指令
  2. 【BZOJ】【4145】【AMPPZ2014】The Prices
  3. title与h1标签的区别和联系
  4. Codeforces Round #174 (Div. 2) Cows and Primitive Roots(数论)
  5. C++遍历树-非递归递归-使用了标记位
  6. SetComputerName改网络中计算机名
  7. GChemPaint-绘制化学分子布局
  8. php html 伪静态,php 伪静态(url重写)的写法
  9. alexa语音实现_如何通过语音删除Alexa录音
  10. 如何重新打开Windows防火墙提示?