当前位置: 首页 > news >正文

C语言学习之调试

         在C语言的编程学习中,我们能不可避免的要遇到bug。通常我们面对编译错误等问题是很容易发现的,但是当我们面对代码结果不满足预期等情况下是很难去改的,因此我们就要学习如何调试代码。

bug与调试

        什么是bug?

        bug本意是“昆虫”和“虫子”的意思,在电脑系统中一般指电脑系统或者程序中隐藏着未被发现的缺陷或者问题,简称程序漏洞。关于bug这个名字有一些历史起源,大家可以自行去搜查,这里不再进行详细地展开说明。

        调试(debug)

        发现问题就要找到并且解决问题,这个找问题的过程就叫做调试,英文叫“debug”。

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

    Debug和release的区别

        在VS中我们会发现这两个按键,分别是什么意思呢?

        Debug通常称之为调试版本,包含调试信息且不做出任何优化,便于调试。

        release称之为发布版本。进行了各种优化,使得程序在大小和速度上都是最优的,方便用户使用。release是用户直接使用的,不包含任何调试信息。

由下图可以发现,对于同一段代码,debug的体积比release体积大了不少。

        

 

 VS调试快捷键

        首先如果要调试,我们必须要在debug环境下进行。

调试常用快捷键:

F9:创建和取消断点。

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

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

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

F10:逐过程,经常用来直接跳到下一个断点处,一般配合F9使用

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

Ctrl+F5:开始不挑食,如果你想让程序直接运行不挑食可以直接使用。

VS更多快捷键请参考这篇文章:

https://blog.csdn.net/mrlisky/article/details/72622009

监视与内存观察

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

下面来看一下吧。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{int arr[5] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){arr[i] = i + 1;}for (i = 0;i < sz;i++){printf("%d ", arr[i]);}return 0;
}

监视

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

        

 这里选择任意一个监视窗口都可以,打开监视窗口后我们可以观察到如下界面。

内存 

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

由下图所示,左侧一块的是地址,右侧的则是其对应的值

 计算机中数据的存储和表示都是二进制,但是使用二进制并不方便,因此多数时候使用十六进制。

打开内存窗口后,输入arr、&num这类地址就能观察到改地址处的数据。

常见的错误分类

编译错误

        编译错误一般都是语法错误,这类错误一般看错误信息、双击错误信息就能跳转到一些痕迹,双击错误信息就能跳转到错误所在的附近。编译错误是随着练习时间越来越长就会越来越少的。

链接错误

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

1.标识符名字不存在

2.拼写错误

3.头文件没有包含

4.引用的库不存在

运行错误

        运行错误通常就是运行结果不符合预期。这个的原因千变万化,需要慢慢地调试定位才能解决问题。

        本篇文章的内容相较于理论,更加侧重于实际代码练习!!!

        感谢看到这里的读者大大,希望能给一个赞,谢谢。

相关文章:

  • 测试基础笔记第十三天
  • 第八部分:缓解 RAG 中的幻觉
  • 6.2 内容生成与营销:个性化内容创作与营销策略优化
  • 常见cmd命令
  • 3.1/Q1,Charls最新文章解读
  • Buffer Pool是什么,有什么作用
  • priority_queue的学习
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十四章 集合框架:告别手写链表的苦役
  • Eigen迭代求解器类
  • 对卡尔曼滤波的理解和简单示例实现
  • 服务器虚拟化:技术解析与实践指南
  • 2025蓝桥省赛c++B组第二场题解
  • python 与Redis操作整理
  • Android HAL HIDL
  • matplotlib画图工具使用(1) 画折线统计图python代码
  • 推论阶梯——AI与思维模型【81】
  • 【SpringBoot】WebConfig 跨域配置详细说明
  • 「蛮荒桌面下载」蛮荒桌面美化版 官方免费下载安卓电视版安装
  • java每日精进 4.26【多租户之过滤器及请求处理流程】
  • Eigen库入门
  • 我国首个核电工业操作系统发布,将在华龙一号新机组全面应用
  • 葛兰西的三位一体:重提并复兴欧洲共产主义的平民圣人
  • 商务部就海外社交平台上发布从所谓中国“代工厂”低价购买国际知名品牌事答问
  • 苏炳添任暨南大学体育学院院长
  • 政治局会议:持续稳定和活跃资本市场
  • 政治局会议:优化存量商品房收购政策,持续巩固房地产市场稳定态势