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

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.引用的库不存在

运行错误

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

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

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

http://www.xdnf.cn/news/2259.html

相关文章:

  • 小白自学python第三天
  • 当高级辅助驾驶遇上“安全驾校”:NVIDIA如何用技术给无人驾驶赋能?
  • Python类和对象四(十三)
  • 2025雅思口语工具Top10:AI软件真实测评
  • 在springboot项目中,如何进行excel表格的导入导出功能?
  • JavaScript基础-算数运算符
  • (四) 实战Trae 编译调试C++项目(以minidocx为例)
  • Winform(2.多线程)
  • C19-while循环及for循环等价引入
  • CANFD技术在实时运动控制系统中的应用:协议解析、性能测试与未来发展趋势
  • (23)VTK C++开发示例 --- 读取所有的PolyData类型示例
  • 网络管理知识点
  • Java----内部类 以及 调用关系
  • Pygame终极项目:从零开发一个完整2D游戏
  • C++之map
  • ngrok 内网穿透技术系统性文档
  • 初始网络流(最小割)
  • 【C语言练习】005. 编写表达式并确定其值
  • leetcode刷题日记——环形链表
  • 新增Webhook通知功能,文档目录树展示性能优化,zyplayer-doc 2.5.1 发布啦!
  • Linux基础篇、第4章_03系统磁盘高级管理LVM 逻辑卷管理器
  • 【头脑风暴】加权平均
  • 模型 递弱代偿
  • [计算机科学#2]:从继电器到晶体管的电子计算机发展史(庞然大物的进化)
  • 视觉大模型专栏导航
  • C++泛型编程(一):模板详解
  • 可视化大屏开发前提了解
  • ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • dl学习笔记(13):从强化学习到PPO
  • cf | Median Splits