老板雇我来公司写Bug
2026/8/9 9:37:54 网站建设 项目流程

文章目录

  • 啥是Bug??
  • 什么是调试(debug)??
  • debug和release之间的区别是什么呢?
  • 调试快捷键
  • 监视和内存观察
    • 监视
    • 内存
  • 调试测试
  • 总结

啥是Bug??

bug本意是"昆虫"或者"虫子",现在一般是指在电脑系统或者程序中,隐藏着的一些未被发现的缺陷或问题,简称为程序漏洞
"Bug"的创始人是格蕾丝·赫柏(Grace Murrary Hopper),她是一位美国海军电脑专家,1947年9月9日,格蕾丝·赫柏对Harvard Mark Ⅱ设置好17000个继电器进行完编程,技术人员启动机器,突然停止了工作,于是工人们去寻找原因,最后竟然发现是一只飞蛾飞到了触点上然后被高电压击死,因此在报告中赫柏用胶条贴上飞蛾,使用"bug"表示一个在电脑程序里的错误,"Bug"这个说法一直沿用至今.

什么是调试(debug)??

当我们发现程序里面有问题,那么我们就要找到它,解决这个问题
找问题的过程被称之为调试,英文名为debug(消灭bug)

debug和release之间的区别是什么呢?

在vs上编写代码的时候我们经常看到这个选项那么这个debug和release是啥意思呢?
debug通常称之为调试版本,它包括调试信息并且不做优化,便于程序员去调试程序,我们在写代码的时候经常去调试代码,就把这里设置为debug,这样编译产生的debug版本的可执行程序包括调试信息可以直接调试
release称之为发布版本它通常是进行了各种的优化,让程序在代码大小和运行速度上都是最优的,方便用户很好的使用,当程序员写完代码并且调试完成,程序的质量符合用户的使用标准这时就会设置为release,编译产生的是release版本的可执行程序,这个版本是用户使用的,不用包含调试信息
同一段代码编译生成的可执行文件的大小,release版本更小,debug版本更大因为release版本是优化过的并且不包含调试信息

调试快捷键

一下是调试最常用的几个快捷键:
F9:创建断点和取消断点
断点:断点的作用就是可以在程序的任意位置设置断点,打上断点就可以使程序执行到想要的位置暂停执行,接下来我们就可以配合F10,F11这些快捷键观察代码执行细节
F5:启动调试,用来直接跳到下一个断点处,一般和F9配合使用
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者一条语句
F11:逐语句,就是每次都执一条语句,但是这个快捷键可以让我们的执行逻辑进入函数内部在函数调用的地方想进入函数观察细节必须使用F11,如果使用F10会直接完成函数调用.
ctrl+F5:开始执行不调试,如果想让程序直接运行起来而不调试就可以直接使用

监视和内存观察

在调试的过程中如果要观察代码执行过程中,代码环境中的变量的值我们可以通过监视和内存观察,这些观察方式的前提条件一定是开始调试后观察的
例如下面这段代码

intmain(){inta[10]={0};inti=0;for(i=0;i<10;i++){a[i]=i+1;}return0;}

监视

开始调试后如下图操作打开监视窗口

进入监视窗口后输入我们想要监视的变量或者数组等的名字然后一步步去调试我们就可以看到这些变量是如何变化的
还有一个要注意的点就是当我们监视二维数组的时候不是简单的敲上二维数组的名字就行,还要再写上我们要监视几行例如有一个二维数组a[10][10],当我们要监视它的前五行时候打开监视窗口,然后在名称列输入: a,5 即可
同理一维数组也是例如有一个一维数组b[10]我们想监视它所有的元素那么我们在监视窗口的名字列输入: b,10 即可

二维数组我们选择了监视的行可以展开查看列

内存



注意我们想要观察谁就在谁的名字前面加上取地址符&就行啦,数组就不用了因为数组名就是数组的首地址

除此之外我们还有自动窗口

自动窗口会根据我们的代码自动给出这些要监视的变量根据我们一步步的调试这些被监视的变量会消失或者出现,这样一来就不太利于我们去观察变量的变化了,因此我们只了解了解即可,平常我们依旧使用监视窗口来监视我i们想要监视的变量

调试测试

请大家在VS2022,X86,Debug的环境下,编译器不做任何优化,下面代码的结果是什么??

#include<stdio.h>intmain(){inti=0;inta[10]={1,2,3,4,5,6,7,8,9,10};for(i=0;i<=12;i++){a[i]=0;printf("haha");}return0;}

最后这个代码会陷入死循环,为啥呢?数组越界应该报错呀,为什么会死循环呢?我们无论如何是想不出来的,只有去调试才能知道这个代码中到底发生了什么导致死循环.

其实这里是有一个巧合,这里我们一直让下标变化到了12,其实i的地址和a[12]的地址重合了因此导致了这组函数陷入了死循环,当然这种巧合是在我们这个代码环境中的如果我们的代码环境变了其实也不会造成这种巧合

所以当我们遇见我们无法理解的情况的时候一定要去调试,调试完后我们就会恍然大悟,原来如此

总结

本文系统地介绍了 C/C++ 程序调试的核心概念与实用技巧:

  1. Bug 与调试基础:从 Bug 的历史起源到调试的基本定义,明确了调试就是发现并解决程序问题的过程。

  2. Debug 与 Release 模式:详细对比了两种编译模式的区别,Debug 版本包含调试信息便于开发调试,Release 版本经过优化适合发布使用。

  3. 调试快捷键:掌握了 F9(断点)、F5(启动调试)、F10(逐过程)、F11(逐语句)等核心快捷键的使用方法。

  4. 监视与内存观察:学会了在调试过程中通过监视窗口和内存窗口观察变量值的变化,这是理解程序运行状态的关键手段。

  5. 实战调试案例:通过数组越界导致死循环的经典案例,展示了调试在解决复杂问题中的不可替代性。

调试不仅是解决问题的工具,更是深入理解程序运行机制、提升编程能力的重要途径。掌握这些调试技能,能够帮助开发者更快定位问题、更深入理解代码执行逻辑,从而编写出更健壮、更高效的程序。

记住:当代码行为不符合预期时,不要只是猜测,打开调试器,让程序自己告诉你发生了什么!

每日一问:今天你调试了吗?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询