继续分享 5 个实用的 vs 调试技巧

前言

我在上一篇文章????《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 个调试技巧虽然都很基础,但是却非常实用,而且使用频率比较高。不知道你是否有所收获呢?

参考资料

《软件调试》

欢迎留言交流!

感谢你的赞和在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Redis6]常用数据类型_String字符串

Redis字符串(String) 简介 String是Redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。String类型是Redis最基本的数据…

在ASP.NET Core中创建自定义端点可视化图

在上篇文章中&#xff0c;我为构建自定义端点可视化图奠定了基础&#xff0c;正如我在第一篇文章中展示的那样。该图显示了端点路由的不同部分&#xff1a;文字值&#xff0c;参数&#xff0c;动词约束和产生结果的端点&#xff1a;在本文中&#xff0c;我将展示如何通过创建一…

[Redis6]常用数据类型_List列表

List列表 简介 单键多值 Redis 列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xff08;左边&#xff09;或者尾部&#xff08;右边&#xff09;。 它的底层实际是个双向链表&#xff0c;对两端的操作性能很高&#xff0c;通过索…

[Redis6]常用数据类型_Set集合

Set集合 简介 Redis set对外提供的功能与list类似是一个列表的功能&#xff0c;特殊之处在于set是可以自动排重的&#xff0c;当你需要存储一个列表数据&#xff0c;又不希望出现重复数据时&#xff0c;set是一个很好的选择&#xff0c;并且set提供了判断某个成员是否在一个s…

来领.NET Core学习资料,7天整理了30多个G(适合各阶段.Net开发者)

干货分享2020/07/27大家好&#xff0c;我是CSDN的小黑&#xff0c;2020年的唯一跳槽季&#xff0c;金九银十马上到来&#xff0c;今天这波干货必须学习起来&#xff01;前后整理了半个月&#xff0c;从零基础到就业&#xff0c;进阶高级开发&#xff0c;走向架构&#xff0c;三…

[Redis6]常用数据结构_Hash哈希

Hash哈希 简介 Redis hash 是一个键值对集合。 Redis hash是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。 类似Java里面的Map<String,Object> 用户ID为查找的key&#xff0c;存储的value用户对象包含姓名&#xff0c;年龄&#xff…

ASP.NET Core中的分布式缓存

ASP.NET Core中的分布式缓存在上一篇文章中[1]&#xff0c;我解释了如何使用内存缓存在ASP.NET Core应用程序中管理缓存。如果您的应用程序托管在单个服务器上&#xff0c;则可以使用这种类型的缓存。那.NET Core框架可以使用哪些工具在云中的分布式方案中进行缓存呢IDistribut…

marquee滚动起始位置_巧用喵影关键帧制作滚动水印,让视频小偷无可盗

视频创作者最奔溃瞬间&#xff0c;不是翻遍了所有网站还找不到合适的素材&#xff0c;也不是作品快完成了却发现电脑死机&#xff0c;而是自己呕心沥血做出来的视频被盗了&#xff0c;结果盗版视频的播放量还更高&#xff01;&#xff01;​理想的解决方法就是给视频打上水印。…

.NET Core + K8S + Loki 玩转日志聚合

Grafana loki1. Intro最近在了解日志聚合系统&#xff0c;正好前几天看到一篇文章《用了日志系统新贵Loki&#xff0c;ELK突然不香了&#xff01;》&#xff0c;所以就决定动手体验一下。本文就带大家快速了解下Loki&#xff0c;并简单介绍.NET Core如何集成Loki。2. Whats Lok…

[Redis6]常用数据类型_Zset有序集合

Zset有序集合 简介 Redis有序集合zset与普通集合set非常相似&#xff0c;是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分&#xff08;score&#xff09;,这个评分&#xff08;score&#xff09;被用来按照从最低分到最高分的方式排序集合中…

css 旋转45_CSS教程——第14期

警告&#xff01;本期内容建议CSS基础良好的人看&#xff0c;本期为实战篇&#xff0c;难度有点大哈喽大家好我是wawjf灰常抱歉我们咕咕了快两周&#xff0c;主要原因是我们的几位作者(加上我其实就两个)去夏令营学习了某重要东西&#xff0c;所以没时间更新&#xff0c;在这里…

使用Azure Blob Storage实现一个静态文件服务器

什么是Azure Blob StorageAzure Blob Storage是微软Azure的对象存储服务。国内的云一般叫OSS&#xff0c;是一种用来存储非结构化数据的服务&#xff0c;比如音频&#xff0c;视频&#xff0c;图片&#xff0c;文本等等。用户可以通过http在全球任意地方访问这些资源。这些资源…

台湾RD技术谈|嘉宾郭家齊董大偉黃保翕

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第四期&#xff0c;本期特辑是首次推出RD技术谈栏目&#xff0c;我们邀请了宝岛台湾的三位重量级嘉宾&#xff0c;保哥、Edward和董大伟三位老师&#xff0c;他们既是微软的最有价值专家&#xff0c;也是微软技术社区区域总监&…

ajax option请求后无post请求_ThingJS:一种浏览器、服务器和技术的新组合方法——Ajax...

Web应用是一种极大方便用户的操作界面&#xff0c;数据维护技术Ajax也从中脱颖而出&#xff0c;ThingJS采用了Ajax的数据维护能够形成轻量化的开发流程。为什么Ajax通过XHR 实现Ajax 通信的一个主要限制&#xff0c;来源于跨域安全策略。默认情况下&#xff0c;XHR 对象只能访问…

[Nginx]负载均衡和动静分离

负载均衡 客户端发送多个请求到服务器&#xff0c;服务器处理请求&#xff0c;有一些可能要与数据库进行交互&#xff0c;服务器处理完毕后&#xff0c;再将结果返回给客户端。 这种架构模式对于早期的系统相对单一&#xff0c;并发请求相对较少的情况下是比较适合的&#xff…

[Nginx]nginx常用的命令

nginx常用的命令 使用nginx操作命令前提条件:必须进入nginx的目录 cd /www/local/webserver/nginx/sbin查看nginx的版本号 ./nginx -v启动nginx ./nginx关闭nginx ./nginx -s stop重新加载nginx ./nginx -s reload

pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件

在项目中因为要经常用到图片预览效果&#xff0c;自己写的话麻烦死啦(懒)vue-photo-preview一个基于 photoswipe 的 vue 图片预览插件&#xff0c;支持移动端和PC端&#xff0c;支持各种手势操作&#xff0c;放大缩小&#xff0c;体验流畅。gitHub: https://github.com/8263277…

[Nginx]nginx的配置文件

nginx配置文件 nginx配置文件位置 nginx配置文件由三部分组成 第一部分 全局块 从配置文件开始到 events 块之间的内容&#xff0c;主要会设置一些影响 nginx 服务器整体运行的配置指令&#xff0c;主要包括配置运行 Nginx 服务器的用户&#xff08;组&#xff09;、允许生成…

Abp vNext 二进制大对象系统(BLOB)

一、简介ABP vNext 在 v 2.9.x 版本当中添加了 BLOB 系统&#xff0c;主要用于存储大型二进制文件。ABP 抽象了一套通用的 BLOB 体系&#xff0c;开发人员在存储或读取二进制文件时&#xff0c;可以忽略具体实现&#xff0c;直接使用IBlobContainer 或 IBlobContainer<T>…

[Nginx]location 指令说明

location 指令说明 该指令用于匹配 URL。 语法如下&#xff1a; 1、 &#xff1a;用于不含正则表达式的 uri 前&#xff0c;要求请求字符串与 uri 严格匹配&#xff0c;如果匹配 成功&#xff0c;就停止继续向下搜索并立即处理该请求。 2、~&#xff1a;用于表示 uri 包含正则…