C 语言 第八讲:VS实用调试技巧

目录

1.什么是bug?

2.什么是调试(debug)?

3.Debug和Release

4.VS调试快捷键

[4.1 环境准备](#4.1 环境准备)

4.2调试快捷键

[5. 监视和内存观察](#5. 监视和内存观察)

5.1监视

5.2内存

6.调试举例

7.调试举例

8.调试举例3:扫雷

9.编程常见错误归类

9.1编译型错误

9.2链接型错误

9.3运行时错误


1,什么是bug

  1. 什么是调试?

  2. debug和release

  3. VS调试快捷键

  4. 监视和内存观察

  5. 调试举例1

  6. 调试举例2

  7. 调试举例3:扫雷

  8. 编程常见错误归类

1.什么是bug?

bug本意是"昆虫"或"虫子",现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏 洞。

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

2.什么是调试(debug)?

当我们发现程序中存在的问题的时候,那下一步就是找到问题,并修复问题。

这个找问题的过程叫称为调试,英文叫debug(消灭bug)的意思。

调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔 离和屏蔽代码的方式,找到问题所的位置,然后确定错误产生的原因,再修复代码,重新测试。

3.Debug和Release

在VS上编写代码的时候,就能看到有debug和release两个选项,分别是什么意思呢?

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

程序员在写代码的时候,需要经常性的调试代码,就将这里设置为debug,这样编译产生的是debug版本的可执 行程序,其中包含调试信息,是可以直接调试的。

Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好 地使用。当程序员写完代码,测试再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会 设置为release,编译产生的就是release版本的可执行程序,这个版本是用户使用的,无需包含调试信息 等。

对比可以看到从同一段代码,编译生成的可执行文件的大小,release版本明显要小,而debug版本明显大。

4.VS调试快捷键

那程序员怎么调试代码呢?

4.1 环境准备

首先是环境的准备,需要一个支持调试的开发环境,我们上课使用VS,应该把VS上设置Debug,如图:

4.2调试快捷键

调试最常使用的几个快捷键:

F9:创建断点和取消断点

断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节。

条件断点:满足这个条件,才触发断点

F5:启动调试,经常用来直接跳到下一个断点处,一般是和F9配合使用。

F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,直接完成函数调用。

CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

VS更多快捷键了解:http://blog.csdn.net/mrlisky/article/details/72622009

5. 监视和内存观察

在调试的过程中我们,如果要观察代码执行过程中,上下文环境的变量的值,有哪些方法呢?

这些观察的前提条件一定是开始调试后观察,比如:

5.1监视

开始调试后,在菜单栏中 【调试】 -> 【窗口】 -> 【监视】,打开任意一个监视窗口,输入想要观察的对象就行。

打开监视窗口:

在监视窗口中观察:

5.2内存

如果监视窗口看的不够仔细,也是可以观察变量在内存中的存储情况,还是在调试】 -> 【窗口】 -> 【监视】

打开内存窗口:

在内存窗口中观察数据:

除此之外,在调试的窗口中还有:自动窗口,局部变量,反汇编,寄存器等窗口,自行验证使用一下

6.调试举例

求1!+2!+3!+4!+...10!的和,请看下面的代码:

cs 复制代码
#include <stdio.h>

// C语言中只能有1个main函数,合并逻辑
int main()
{
    int n = 0;    // 用于遍历1~10
    int i = 1;    // 用于计算单个阶乘的循环变量
    int sum = 0;  // 存储阶乘的总和
    int ret = 1;  // 存储单个数字的阶乘(必须声明+初始化)

    // 外层循环:遍历1~10,计算每个数的阶乘
    for(n = 1; n <= 10; n++)
    {
        ret = 1; // 每次计算新的阶乘前,必须重置ret为1(否则会累加之前的结果)
        // 内层循环:计算当前n的阶乘(n! = 1×2×...×n)
        for(i = 1; i <= n; i++)
        {
            ret *= i; // 等价于 ret = ret * i
        }
        sum += ret; // 把当前n的阶乘累加到总和
    }

    // 输出最终结果
    printf("1!+2!+3!+...+10!的和是:%d\n", sum);
    return 0;
}

7.调试举例

在VS2022,X86,Debug的环境下,编译器不做任何优化的话,下面代码执行的结果是啥

cs 复制代码
#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hehe\n");
    }
    return 0;
}

8.调试举例3:扫雷

如果一个代码稍微复杂,那怎么调试呢?

这里我们就上手调试一下扫雷的代码。

演示;

·在函数内部打断点,快速跳转到函数

·在数组传参,调试进入函数,如何在监视窗口观察数组的内容:数组名,n的形式

调试过程中,要做到心中有数,也就是程序员自己心里要清晰的知道希望代码怎么执行,然后再去看代码有没有按照我们预定的路线在执行。

调试是需要反复去动手练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能力,就能看到本质,就像能给程序做B超一样,对程序内部一览无余

9.编程常见错误归类

9.1编译型错误

9.2链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是因为

·标识符名不存在

·拼写错误

·头文件没包含

·引用的库不存在

9.3运行时错误

运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时问题。

完。

相关推荐
Jerry24 分钟前
LeetCode 454. 四数相加 II
算法
可编程芯片开发1 小时前
基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真
算法
苍狼唤1 小时前
WinForm练习知识补充(多线程)
c#
zt1985q1 小时前
本地部署开源智能家居集成平台 ioBroker 并实现外部访问( Windows 版本)
运维·服务器·智能家居
2zcode1 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
Jerry1 小时前
LeetCode 202. 快乐数
算法
大卡片1 小时前
linux内核驱动开发
linux·运维·驱动开发
hans汉斯2 小时前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer
Jerry2 小时前
LeetCode 349. 两个数组的交集
算法
必须得开心呀2 小时前
QT解决中文乱码问题
开发语言·qt