C语言初阶:十一.代码调试技巧

news2024/12/26 11:07:22

❤欢迎各位大佬访问:折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c++,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?type=blog
❤文章所属专栏icon-default.png?t=O83Ahttps://blog.csdn.net/2303_80170533/category_12794764.html?spm=1001.2014.3001.5482

前言:

  在C语言编程的初阶阶段,代码调试是一项至关重要的技能。无论是初学者还是经验丰富的程序员,都会遇到代码无法按预期运行的情况。这时,掌握一些有效的调试技巧能够显著提高问题解决效率,使编程过程更加顺畅。

  代码调试技巧涵盖了从基本的语法错误检查到复杂的逻辑问题排查。这包括使用调试工具(如GDB)、添加调试信息(如打印语句)、设置断点、单步执行代码、检查变量值以及内存分配等。通过这些方法,开发者可以逐步缩小问题范围,定位并修复代码中的错误。

  掌握良好的代码编写习惯,如模块化设计、清晰的变量命名和合理的注释,也能在调试过程中起到事半功倍的效果。这些习惯不仅有助于自己理解代码,还能让他人在需要时快速上手并协助调试。

1.什么是bug?

bug的来由(文心一言提供的解答)

  1. 昆虫起源:在计算机科学中,“bug”一词最初是指实际上的昆虫。在计算机发展的早期阶段,如电子管计算机和晶体管计算机时期,计算机的物理结构相对庞大且复杂,机器内部布满了错综复杂的电路和线路。这些环境很容易吸引各种昆虫,尤其是像蟑螂、蜘蛛等小昆虫。这些小昆虫有时会爬到电路板上,造成短路或断路,从而导致计算机出现故障。因此,工程师们开始用“bug”来形象地描述这种由昆虫引起的计算机故障。

  2. 历史记录:据说,在1945年9月9日,美国哈佛大学的Grace Hopper(格蕾丝·霍珀)博士在调试Mark II计算机时,发现了一只死蛾子(moth)卡在继电器触点之间,从而导致了计算机故障。她将这个蛾子用胶带粘在日志本上,并标注了“First actual case of bug being found”(第一个发现的实际bug案例)。这一事件被广泛认为是“bug”一词在计算机领域中的起源。

2.调试的作用

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

 调试的步骤

发现程序错误的存在

以隔离、消除等方式对错误进行定位

确定错误产生的原因

提出纠正错误的解决办法

对程序错误予以改正,重新测试

3.debug和release的介绍

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。 Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。

int main()
{
	int n = 0;
	int a = 0;
	scanf("%d %d", &a, &n);//2 5
	//计算
	int sum = 0;
	int i = 0;
	int k = 0;
	for (i = 0; i < n; i++)
	{
		k = k * 10 + a;
		sum += k;
	}
	//打印
	printf("%d\n", sum);
	return 0;
}

上述代码在Debug环境的结果展示:

上述代码在Release环境的结果展示:

所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。

4.windows环境调试介绍

4.1   调试环境的准备

调试代码,要选择在Debug环境下进行

4.2  学会使用快捷键

按f10就进入了调试,在上方图片中我们可以看见如何进行调试查看相应的变量及运行步骤

最常使用的几个快捷键:

F5 启动调试,经常用来直接跳到下一个断点处。

F9 创建断点和取消断点 断点的重要作用,可以在程序的任意位置设置断点。 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

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

F11 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最 长用的)。

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

CTRL+F可以进行查询文件中的变量名等

4.3  调试的时候查看程序当前信息

查看临时变量的值 在调试开始之后,用于观察变量的值。

5.如何写出好的代码(易于调试)

1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6. 注释清晰 7. 文档齐全

1. 使用assert()//断言

2. 尽量使用const

3. 养成良好的编码风格

4. 添加必要的注释

5. 避免编码的陷阱。

//实现库函数strlen--求字符串长度
unsigned int  my_strlen(const char * str)
{
	int count = 0;
	assert(str != NULL);
	while (*str++ != '\0')
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", my_strlen(arr));
	return 0;
}

注意:

1. 分析参数的设计(命名,类型),返回值类型的设计

2.野指针,空指针危害

3. assert的使用,assert的作用

4. 参数部分 const 的使用

void my_strcpy(char* dest, char* src)
{
	//if (src == NULL || dest == NULL)//防止空指针
	//{
	//	return;
	//}
	//断言
	//assert中可以放一个表达式,表达式的结果为假就会报错
	//如果为真,什么事都不会发生
	//assert在release版本中优化了
	/*assert(src != NULL);
	assert(dest!= NULL);*/
	assert(src && dest);
	while (*dest++ = *src++)//  \0的ASCII码值为0,while循环判断为假,停止
	{
		;
	}
}
//const修改指针变量的时候
//1.const放在*的左边,修饰的是指针指向的内容,表示指针指向的内容,不能通过指针改变了
//const int* p=&num;
//  
//2.const放在*的右边,const修饰的是指针变量本身,
// 表示指针变量本身的内容不能改变,但是指针指向的内容不能改变
//int* const p=&num;
//int main()
//{
//	/*const int num = 10;
//	const int* p = &num;
//	*p = 20;*/
//	//printf("%d\n", num);
//
//	return 0;
//}

6.编程常见的错误

1 编译型错误 直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

2 链接型错误 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不 存在或者拼写错误。

3 运行时错误 借助调试,逐步定位问题。最难搞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux265资源分享网——Linux命令大全在线网址

Linux命令大全在线网址 https://linux265.com/

Chrome浏览器控制台替换接口返回内容

1.打开Chrome DevTools&#xff1a; 使用快捷键F12或右键点击页面并选择“检查”来打开Chrome DevTools。 2.导航到Network面板&#xff1a; 在DevTools的顶部菜单中&#xff0c;选择“Network”&#xff08;网络&#xff09;面板以监视网络请求。 3.发起目标请求&#xff1a; …

HarmonyOS开发5.0 net 启动界面设置

第一步、创建我们界面 第二步&#xff0c; 在EntryAbility中配置启动页面&#xff0c;在entry/src/main/ets/entryability/EntryAbility.ets中配置启动页面 配置如下 至此大功告成

ssm012医院住院管理系统(论文+源码)_kaic

摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院住院就变成了一个问…

UML图之对象图详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是对象图 对象图&#xff08;Object Diagram&#xff09;是UML中一种重要的静态结构图&#xff0c;它用于表示在特定时间点上系统中的对…

STM32之外部中断(实验对射式传感器计次实验)

外部中断配置 #include "stm32f10x.h" // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void) {//RCC--> GPIO--> AFIO--> EXTI--> NVIC五步RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时…

MFC的SendMessage与PostMessage的区别

一、SendMessage 同步操作&#xff1a; SendMessage 是一个同步函数&#xff0c;它会将消息发送到指定的窗口&#xff0c;并等待该窗口的消息处理过程完成&#xff0c;然后返回。这意味着它会阻塞当前线程&#xff0c;直到消息处理完成。 直接调用&#xff1a; SendMessage 会…

update-alternatives(选择工具)

0 Preface/foreword 1 update-alternatives介绍 1.1 选项和用法 1.2 install用法 update-alternatives --install <link> <name> <path> <priority> [--slave <link> <name> <path>] link&#xff1a;符号链接&#xff08;软链…

PostgreSQL(WINDOWS)下载、安装、简单使用

下载 PostgreSQL: Downloads PostgreSQL: Windows installers EDB: Open-Source, Enterprise Postgres Database Management 安装 注意密码要方便自己使用&#xff0c;不能忘记。 打开pgAdmin&#xff0c;输入密码 新建数据库 打开命令工具 新建表

疯狂讲义———第3章 数据类型与运算符

目录 一.注释的重要性 1.注释 2.Java语言的注释类型 3.文档注释 二.javadoc命令的用法 三.数据类型的两大类 四.8种基本类型及各自的注意点 1.整型 2.字符型 3.浮点型 4.布尔型 五.自动类型转换和强制类型转换 六.表达式类型的自动提升 七.Java提供的基本运算符 八.运算符的结…

【算法】递归系列:206.反转链表(两种递归实现)

目录 1、题目链接 2、题目介绍 3、解法 递归法&#xff08;从前往后递归&#xff09; 从后往前递归 4、代码 递归法&#xff08;从前往后递归&#xff09; 从后往前递归 1、题目链接 206.反转链表 2、题目介绍 3、解法 递归法&#xff08;从前往后递归&#xff09; 递归…

编程之路:蓝桥杯备赛指南

文章目录 一、蓝桥杯的起源与发展二、比赛的目的与意义三、比赛内容与形式四、比赛前的准备五、获奖与激励六、蓝桥杯的影响力七、蓝桥杯比赛注意事项详解使用Dev-C的注意事项 一、蓝桥杯的起源与发展 蓝桥杯全国软件和信息技术专业人才大赛&#xff0c;简称蓝桥杯&#xff0c…

uni-app 运行HarmonyOS项目

1. uni-app 运行HarmonyOS项目 文档中心 1.1. HarmonyOS端 1.1.1. 准备工作 &#xff08;1&#xff09;下载DevEco Studio开发工具。   &#xff08;2&#xff09;在 DevEco Studio 中打开任意一个项目&#xff08;也可以新建一个空项目&#xff09;。   &#xff08;3&…

camera和lidar外参标定

雷达和相机的外参标定&#xff08;外部参数标定&#xff09;指的是确定两者之间的旋转和平移关系&#xff0c;使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…

【Python3】【力扣题】405. 数字转换为十六进制数

【力扣题】题目描述&#xff1a; 题意理解&#xff1a;&#xff08;不允许使用库函数&#xff09; 数字等于0&#xff0c;则结果为0&#xff0c; 数字小于0&#xff0c;则补码运算&#xff0c;即最高位&#xff08;32位&#xff09;为1&#xff0c;其余全部取反&#xff0c;再加…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

PointLIO利用unilidar复现

配置宇树激光雷达的时候出现程序报错问题 问题&#xff1a; 问题链接 原因&#xff1a;普通账户没有权限访问设备——也就是ubuntu 存在串口数据读取权限问题 ttyS0设备的用户主为root,所属的组为dialout 同时owner和group都是有相同的rw权限的&#xff0c;但others是没有任何…

Kafka 客户端工具使用分享【offsetexplorer】

前言&#xff1a; 前面我们使用 Spring Boot 继承 Kafka 完成了消息发送&#xff0c;有朋友会问 Kafka 有没有好用的客户端工具&#xff0c;RabbitMQ、RocketMQ 都有自己的管理端&#xff0c;那 Kafka 如何去查看发送出去的消息呢&#xff1f; 本篇我们就来分享一个好用的工具…

5G基础知识

那个工种&#xff1f; FDD 频分双工&#xff08;Frequency Division Duplexing&#xff09;&#xff0c;理解起来很简单&#xff0c;就是把上行和下行业务隔离在两个频段&#xff0c;互不干扰。 而 TDD 时分双工&#xff08;Time-Division Duplexing&#xff09;&#xff0c;是…

python读取视频并转换成gif图片

1. 安装三方库 moviepy 将视频转换成gif&#xff0c;需要使用 moviepy库 确保已经安装了moviepy库 pip install moviepy2. 代码实现&#xff1a; from moviepy.editor import VideoFileClipmyclip VideoFileClip("video.mp4") myclip2 myclip.subclip(0, 10).re…