文章目录

  • 一、什么是bug
  • 二、什么是调试及调试的重要性
    • 1、什么是调试
    • 2、调试的基本步骤
    • 3、Debug和Release的介绍
  • 三、Windows下VS常用调试快捷键
  • 四、VS常用调试技巧
    • 1、查看临时变量的值
    • 2、查看内存信息
    • 3、查看调用堆栈
    • 4、查看反汇编
    • 5、查看寄存器
  • 五、如何写出好(易于调试)的代码
    • 1、什么是高质量的代码
    • 2、常见的代码技巧
    • 3、优秀代码示范
  • 6、编程中常见的错误
    • 1、编译型错误
    • 2、链接型错误
    • 3、运行时错误

一、什么是bug

Bug一词的原意是“昆虫”或“虫子”;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。

“Bug”的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字,正是由赫柏所取的。1947年9月9日,赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以在报告中,赫柏用胶条贴上飞蛾,并把“bug”来表示“一个在电脑程序里的错误”,“Bug”这个说法一直沿用到今天。


二、什么是调试及调试的重要性

1、什么是调试

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧, 就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。

顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。而调试的过程就是追寻真想的过程。

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。

2、调试的基本步骤

你们平时都是怎样写代码的呢?

你们平时又是怎样调试的呢?

很显然,上面的这种迷信调试、阳寿调试法是不对的,我们应该用科学的方法进行调试,那么科学的调试步骤是怎样的呢?

  1. 发现程序错误的存在
  2. 以隔离、消除等方式对错误进行定位
  3. 确定错误产生的原因
  4. 提出纠正错误的解决办法
  5. 对程序错误予以改正,重新测试

3、Debug和Release的介绍

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。

注意:当我们把程序从Debug版本改为Release版本时,需要将程序在release版本下重新编译链接一次,才会生成release版本下的.exe文件。

其实,release不仅可以优化内存和运行速度,在一些情况下还可以避免程序死循环,例如下面这段代码:

#include int main(){    int i = 0;    int arr[10] = {0};    for(i=0; i<=12; i++)   {        arr[i] = 0;        printf("hehe\n");   }    return 0;}

在Debug版本下,这段代码会陷入死循环:

而在Release版本下,程序则不会陷入死循环:

注意:上面这段代码在Debug下出现死循环是VS2019编译器下的一种巧合(与栈区的使用习惯、数组的特点、函数栈帧有关),在其他的编译器或者其他的VS版本下不一定会出现死循环,这里只是利用这种巧合来说明Release版本的特点。


三、Windows下VS常用调试快捷键

  • F5: 启动调试,经常用来直接跳到下一个断点处。
  • F9: 创建断点和取消断点的重要作用,可以在程序的任意位置设置断点。 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
  • F10: 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
  • F11: 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
  • CTRL + F5: 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

想了解更多VS快捷键?点我


四、VS常用调试技巧

1、查看临时变量的值

F10进入调试状态 -> 调试 -> 窗口 -> 自动窗口/监视。

注意:自动窗口和监视都能观察局部变量的信息,二者的区别在于:自动窗口会自动显示所有局部变量的信息(不管你是否需要),监视需要程序员手动输入(想观察谁就输入谁);对于编程小白建议使用自动窗口,但是对于有一定基础的编程人员还是建议使用监视。

2、查看内存信息

F10进入调试状态 -> 调试 -> 窗口 ->内存。

3、查看调用堆栈

F10进入调试状态 -> 调试 -> 窗口 ->调用堆栈。

4、查看反汇编

F10进入调试状态 -> 调试 -> 窗口 ->反汇编。

5、查看寄存器

如果想了解更多反汇编和寄存器相关的知识,可以看看我写的另一篇文章:

优秀程序员写的:8分代码

大佬写的:10分代码


示例2:模拟实现strcpy函数:

普通程序员写的:5分代码

优秀程序员写的:8分代码

大佬写的:10分代码

如果有不会使用const关键字的同学可以阅读这篇文章:

2、链接型错误

一般是调用函数时(包括自定义函数和库函数)函数名写错造成,我们可以复制错误信息,通过ctrl+f快捷键进行搜索定位即可解决。

3、运行时错误

这类错误一般都是由于数组越界、函数递归时栈溢出类似原因造成的,这类错误最不易改正和发现,它需要我们逐步调试来定位错误,然后分析错误发生的原因,最后改正。


最后希望大家都能做一个有心人,积累排错经验,写出优秀的代码。