继续分享5个实用的vs调试技巧(代码片段)

bianchengnan bianchengnan     2022-12-08     538

关键词:

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

前言

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

1. 条件断点

作用简介:

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

技术图片

 

2. 内存断点

作用简介:

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

 

技术图片
memoryaccess-breakpoint

 

打开方式:

调试的时候,通过 调试 -> 窗口 -> 断点 即可打开断点窗口。在 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;
    

 

技术图片
exception

 

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;
    

 

技术图片
manual-modify-variable

 

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

5. 拖动到指定位置执行

作用简介:

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

 

技术图片
drag-to-specific-line

 

注意:

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

测试工程下载地址

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

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

总结

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

参考资料

《软件调试》

vs环境——c语言实用调试技巧(代码片段)

目录什么是bug?调试的目的调试的基本步骤Debug和Release的介绍windows环境调试介绍 1.选择Debug调试版本 2.学会快捷键 3.调试窗口的使用 1.局部变量窗口  2.监视窗口 3.内存查看窗口 4.调用堆栈窗口什么是bug?bug是计算... 查看详情

es6的几个实用技巧,你了解吗?(代码片段)

本文给大家分享了es6的几个实用技巧,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 Hack#1交换元素利用数组解构来实现值的互换leta=‘world‘,b=‘hello‘[a,b]=[b,a]console.log(a)//->helloconsole.log(b)//->worldHack#2调试我们... 查看详情

5个实用的css技巧(代码片段)

:where()伪类函数上面的代码可以用:where()伪类函数优化为:where()伪类函数上面的代码可以用:where()伪类函数优化为Conicgradients(圆锥渐变)函数ScrollSnap❝CSSScrollSnap是CSS中一个独立的模块,可以让网页容器滚动停止的时候... 查看详情

vs编译器实用调试技巧

一、Debug和Release的区别debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。release称为发布版本,他往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好使用代码... 查看详情

分享几个实用的技巧(代码片段)

日积跬步。1.重建rpmdb有时候rpm数据库偶尔发生损坏,无法安装新rpm包:rpmdb:Thread/process21721/140622824318880failed:ThreaddiedinBerkeleyDBlibraryerror:db3error(-30974)fromdbenv->failchk:DB_RUNRECOVERY:Fatalerror,rundatabaserecoveryerror:cannotopenPackagesindexu... 查看详情

10个javascript调试技巧,帮你更好更快地调试代码

...alert会阻塞UI和javascript的执行,必须点击‘OK‘按钮才能继续,非常低效。所以,喜欢使用alert的同学可以改改这个习惯了。2、学会使用console.time有时候我们想知道一段代码的性能或者一 查看详情

实用调试技巧下篇(代码片段)

🔴本文章是在VisualStudio2022(VS2022)编译环境下进行操作讲解文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息🥳4.调试实例🥳5.如何写出&#... 查看详情

实用调试技巧(代码片段)

调试技巧调试是什么?有多重要?一、调试的基本步骤二、Debug和Release的介绍。三、学会快捷键四、调试的时候查看程序当前信息五.实例实例一实例二六.如何写出好(易于调试)的代码示范注意七.编程常见错误... 查看详情

intellijidea超实用使用技巧分享

https://blog.csdn.net/weixin_38405253/article/details/102583954 知识点概览:高效率配置日常使用必备快捷键(★★)查找跳转切换编码相关代码阅读相关版本管理相关编码效率相关(★★)文件代码模板实时代码模板其他代码调试源码阅... 查看详情

基础篇5#链表(下):写好链表代码的六个实用技巧(代码片段)

说明【数据结构与算法之美】专栏学习笔记技巧一:理解指针或引用的含义指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。例如:p—>next=q:表... 查看详情

基础篇5#链表(下):写好链表代码的六个实用技巧(代码片段)

说明【数据结构与算法之美】专栏学习笔记技巧一:理解指针或引用的含义指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。例如:p—>next=q:表... 查看详情

08实用调试技巧(代码片段)

...程中能够帮助我们排错,试错,不断成神精进的实用调试技巧( 查看详情

全网最实用的ideadebug调试技巧(超详细案例)(代码片段)

...是决定我们进阶到更高层级的一个重要技能。今天跟大家分享一下IDEA中Debug调试的各种奇技淫巧。本文内容有视 查看详情

全网最实用的ideadebug调试技巧(超详细案例)(代码片段)

...是决定我们进阶到更高层级的一个重要技能。今天跟大家分享一下IDEA中Debug调试的各种奇技淫巧。本文内容有视 查看详情

分享几个springboot实用的小技巧(代码片段)

前言最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的:SpringBoot使用中的一些小技巧。算不上多高大上的东西,但都还挺有用。屏蔽外... 查看详情

c语言进阶学习笔记七程序执行+调试技巧(实用技巧篇)(代码片段)

文章目录一、程序执行篇①预处理详解②宏定义③define标识符字符串④define宏名(参数表)字符串⑤宏和函数对比二、调试技巧篇①什么是bug?②调试是什么?有多重要?③debug和release的介绍④windows环境调试介绍⑥如何写出... 查看详情

分享10个超实用的python编程技巧(代码片段)

作者|欣一来源|Python爱好者集中营今天小编来给大家分享几个Python的编程技巧,帮助你迅速完成地从小白到Python大神的蜕变。字典翻转首先我们来看字典的翻转,假设我们有下面类似的一个字典对象与数据car_dict =   ... 查看详情

24个好用到爆的python实用技巧!(代码片段)

...朵君来源| 数据STUDIO在这里,我尝试以A-Z开头的格式分享这些技巧中的一些,并且在本文中简单介绍这些方法,如果你对其中一个或多个感兴趣,你可以通过文末参考资料查看官方文档。希望对你能有所帮助。A-Z... 查看详情