学会调试,让你也成为改bug能手

简介: 学会调试,让你也成为改bug能手

一、错误代码示范


首先来看一下我们的代码,我们预期它要输出"Parameter is not 7",结果它输出了"Parameter is 7",我想破了头也想不通哪里出问题了,内心独白就是“这么几句代码,我怎么可能写错?”


void Function_1(int Parameter)
{
  int a = 1;
  int b = 2;
  if (Parameter = 7)
  {
  cout << "Parameter is 7" << endl;
  }
  else
  {
  cout << "Parameter is not 7" << endl;
  }
  return;
}
int main()
{
  int a = 5;
  Function_1(5);
  return 0;
}


二、开始调试


我们首先在VS2017中打开我们的C/C++项目,打开我们要调试的项目,接下来进入调试状态:


1. 下断点

首先来说一下下断点的意义,下断点,在我理解看来就是让程序执行流断开,在断点处停住,当我们开始调试的时候,程序会停留在断点处,此时我们可以查看变量内容,看程序目前的执行结果等等。那么如何下断点?我通常使用有2个方法:


(1)将鼠标移至想要下断的代码所在行的最左端,然后点击鼠标左键。

假如我们想要在65行处下断电,那么如下图所示:

image.png

点击完毕,左侧出现实心红点,效果如图:

image.png


(2)在我们想下断的行,点击鼠标左键,让鼠标处在那一行的任意位置,然后按键盘最上方的快捷键F9,就会有断点出现:

image.png

按F9之后,断点出现:

image.png


那我们想要取消这个断点该如何操作呢??同样的动作再来一次,它就取消了,可以直接将鼠标定位在指定行,然后按F9,或者直接点击最左侧的红色实心点,断点就取消了。


注意:断点可以下很多个,不止一个嗷~,我们这篇文章为了演示,我下两个断点,分别在main函数的第一句和Function_1()函数的 if 语句起始位置:

image.png


2. 开始调试

当我们下好断点之后,点击vs最上方工具栏调试–>开始调试,然后就可以进入调试状态,或者在断点下好之后,直接点击键盘最上方F5,也可以进入调试状态:

image.png

进入调试状态之后,会有一个黄色光标出现,这意味着调试的开始,黄色光标所指向的行,就是还未执行,但是接下来就要执行的行。


2.1 单步步过

执行调试可以单步步过,也可以直接执行到下一个断点,跳过中间的步骤,如果我们一开始不知道问题出在哪里,可以选择在最初的一句下断点,然后点击VS最上方工具栏调试–>逐过程,就可以执行到当前断点的下一条语句,或者直接按快捷键F10,也可执行同样效果

image.png

执行一步之后,效果如图:

image.png


此时我们来到了一个函数处,如果我们想要单步步过,那就不在Function_1()函数中下断点,然后点击F10,断点将到达return 0;处。如果我们想要进入函数,可以怎么办?


2.2 单步步入

当我们光标执行到Function_1()处,想看看里面发生的情况,那么可以点击工具栏调试–>逐语句,或者直接键盘上方快捷键F11,就会进入函数内部:

image.png

进入之后,如下图所示:

image.png

此时我们可以用F10单步步过来继续执行调试。但是当我们觉得前面这些步骤都没必要,我感觉问题就出在 if 语句这里,于是在这里下了断点,我能不能直接加将光标执行到这里呢?


2.3执行到断点处

想要直接执行到断点处,我们可以怎么操作?加入我们一开始处于这里:

image.png

接下来点击工具栏调试–>继续,或者直接键盘上方快捷键F5,就可以到达下一个断点处(前提是执行到这个断点之前,程序都是正确的)。

image.png

执行完毕之后,就确实执行到了想要来的地方:

image.png


3. 查看变量信息,找出BUG

现在我们知道了怎么去调试,那对于上面代码的执行,我们充满疑惑,我们传参是5,但是结果输出却不是5,为什么?就让我们一探究竟!

在开始调试之后,点击工具栏调试–>窗口–>监视–>监视 1,打开一个监视窗口,这个窗口可以供我们监视程序中的变量:

image.png

点击监视之后,应该会出现下图所示的监视框:

image.png

我们在名称这个部位输入我们要监视的变量名Parameter:

image.png

当前程序还没执行 if 语句,我们看到Parameter中的值确实是我们传入的5,接下来F10,让它执行一步:

image.png

结果光标执行到了 if 语句的花括号内,然后Parameter的值发生了变化,变成了红色的7,红色意味着值发生改变。


那么我们明明执行的是判断语句,为什么最后好像成了赋值语句?

定睛一看!!! if 语句判断 少写了一个’=’,本来应该是if(Parameter == 7),于是我们对代码进行修改,完成了bug查找。


本篇有关调试的基础文章到此结束,学会调试的你,一定会在以后的查bug之路上,攻城拔寨,势如破竹!!


目录
相关文章
|
21天前
|
程序员 测试技术
程序员的“Bug之旅”:为何无法一次性写出完美代码?
程序员在软件开发过程中难以一次性写出完美代码,需要不断修改和调试,即“改Bug”,这是由多个因素共同作用的结果。技术层面的复杂性、管理和流程上的不足以及个人能力和认知的局限性都是导致这一现象的重要原因。然而,这并不意味着无法避免或改进。通过加强需求管理、建立有效的版本控制和测试机制、推动团队知识共享以及鼓励代码审查和自我反思等措施,可以降低改Bug的频率和成本,提高软件开发的效率和质量。辩证地看待这一问题,既要理解其存在的合理性,也要积极寻求改进之道,以实现更好的产品和服务。
13 2
|
7月前
|
SQL JSON 前端开发
【改BUG】项目遇到的奇葩bug
【改BUG】项目遇到的奇葩bug
|
4月前
|
开发者 C++ UED
你以为的Bug VS 实际的Bug:解密程序开发中的意外之旅
作为开发者,我们在日常开发过程中经常会遇到各种各样的Bug,有些Bug可能很容易发现并解决,但也有一些Bug让人感到困惑摸不到头脑,甚至是无厘头Bug,就像我们以为的Bug与实际的Bug之间的差异一样,让人头大。所以我们在日常开发过程中,一定要细心、细致、细顾,在面对任何Bug的时候都要抱着敬畏的心态去解决,因为我们永远不知道在实际程序开发中的意外是啥,有什么意外在等着我们去发现和解决。那么本文就来讨论分享一下开发者在工作过程中遇到的“你以为的Bug”与“实际的Bug”之间的差异在哪里?,然后通过一个有趣的比喻,我们将深入分析这些不同类型的Bug,还有就是在解决问题时的重要性和挑战。
29 1
你以为的Bug VS 实际的Bug:解密程序开发中的意外之旅
|
6月前
|
数据库 C++
《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
67 0
|
运维 架构师 Java
你目前写过最大的bug
你目前写过最大的bug
124 0
|
监控 NoSQL Linux
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(一)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
572 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(一)
|
存储 NoSQL IDE
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
273 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(三)
|
NoSQL Shell C语言
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(二)
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解
351 0
【五、深入浅出GDB调试器】如何修复程序bug或优化代码:gdb调试器的来龙去脉与debug全方位实战详解(二)
|
SQL 运维 测试技术
被问:这个BUG为什么没测出来?该如何回答
被问:这个BUG为什么没测出来?该如何回答
137 0
被问:这个BUG为什么没测出来?该如何回答
|
Java 应用服务中间件 Docker
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧
代码Debug调试是研发工程师日常工作中必不可少的重要组成部分。进行代码Debug调试的目的无非就两个,一个是自我检查代码逻辑是否有问题,便于自己将Bug消灭在测试介入之前;另一个是进行线上问题排查定位,找到实际在跑业务的过程中出现的Bug。
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧