C语言初阶:十一.代码调试技巧
❤欢迎各位大佬访问:折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c++,java,qt,c语言领域.
https://blog.csdn.net/2303_80170533?type=blog
❤文章所属专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm=1001.2014.3001.5482
前言:
在C语言编程的初阶阶段,代码调试是一项至关重要的技能。无论是初学者还是经验丰富的程序员,都会遇到代码无法按预期运行的情况。这时,掌握一些有效的调试技巧能够显著提高问题解决效率,使编程过程更加顺畅。
代码调试技巧涵盖了从基本的语法错误检查到复杂的逻辑问题排查。这包括使用调试工具(如GDB)、添加调试信息(如打印语句)、设置断点、单步执行代码、检查变量值以及内存分配等。通过这些方法,开发者可以逐步缩小问题范围,定位并修复代码中的错误。
掌握良好的代码编写习惯,如模块化设计、清晰的变量命名和合理的注释,也能在调试过程中起到事半功倍的效果。这些习惯不仅有助于自己理解代码,还能让他人在需要时快速上手并协助调试。
1.什么是bug?
bug的来由(文心一言提供的解答)
-
昆虫起源:在计算机科学中,“bug”一词最初是指实际上的昆虫。在计算机发展的早期阶段,如电子管计算机和晶体管计算机时期,计算机的物理结构相对庞大且复杂,机器内部布满了错综复杂的电路和线路。这些环境很容易吸引各种昆虫,尤其是像蟑螂、蜘蛛等小昆虫。这些小昆虫有时会爬到电路板上,造成短路或断路,从而导致计算机出现故障。因此,工程师们开始用“bug”来形象地描述这种由昆虫引起的计算机故障。
-
历史记录:据说,在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=#
//
//2.const放在*的右边,const修饰的是指针变量本身,
// 表示指针变量本身的内容不能改变,但是指针指向的内容不能改变
//int* const p=#
//int main()
//{
// /*const int num = 10;
// const int* p = #
// *p = 20;*/
// //printf("%d\n", num);
//
// return 0;
//}
6.编程常见的错误
1 编译型错误 直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
2 链接型错误 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不 存在或者拼写错误。
3 运行时错误 借助调试,逐步定位问题。最难搞。
相关文章:
C语言初阶:十一.代码调试技巧
❤欢迎各位大佬访问:折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?typeblog❤文章所属专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.300…...
Jenkins Pipeline 部署总结
Jenkins Pipeline 部署总结 前言 Jenkins Pipeline 是 Jenkins 提供的一套强大的工作流框架,它允许开发者以代码的形式定义整个软件交付过程,从而实现持续集成和持续部署(CI/CD)。通过 Pipeline,原本独立运行于单个或…...
HTTP的初步了解
目录 前言 一、HTTP协议的基本概念 1.1、请求格式 1.2、响应格式 二、HTTP链接问题 前言 提示:这里可以添加本文要记录的大概内容: HTTP协议是超文本传输协议 HTTP的短连接:建立连接——数据传输——关闭连接 HTTP的长连接:…...
SM单元 硬件
在硬件上,SM(Streaming Multiprocessor)指的是流式多处理器单元,它是GPU架构中非常重要的组成部分。SM可以看作是GPU的心脏,类似于CPU核心,负责执行并行计算任务。每个SM包含多个流处理器(cores…...
如何从CSV、JSON等格式创建DataFrame
在Spark中,你可以使用 SparkSession 从CSV和JSON等格式创建 DataFrame。以下是如何从这两种格式创建 DataFrame 的示例。 1. 从CSV文件创建DataFrame scala// 创建SparkSessionval spark SparkSession.builder().appName("CSV to DataFrame").getOrCrea…...
Java避坑案例 - 线程池错误的混用引发的性能故障分析
文章目录 问题现象问题分析问题修复线程池的混用策略任务类型与线程池配置最佳实践 问题现象 代码使用了线程池异步处理一些内存中的数据,但通过监控发现处理得非常慢,整个处理过程都是内存中的计算不涉及 IO 操作,也需要数秒的处理时间&…...
七种方法助你找到实用且免费的API服务
随着现代互联网的迅猛发展,API(应用程序编程接口)已成为推动技术创新的核心工具。API使得开发者能够快速实现复杂的功能,如数据分析、自然语言处理、图像识别等,而无需从头编写大量的代码。在这个开放的生态中…...
leetcode-74-搜索二维矩阵
题解: 遍历二维数组matrix中的每个list,如果target在list中则返回True(退出循环);如果全部遍历完还没有出现target则返回False。 核心就是在list中查找target! 代码实现:...
122.WEB渗透测试-信息收集-ARL(13)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:121.WEB渗透测试-信息收集-ARL(12) 输入命令: docker…...
动态规划 —— 路径问题-下降路径最小和
1. 下降路径最小和 题目链接: 931. 下降路径最小和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-falling-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到…...
【Linux网络】TCP_Socket
目录 TCP协议(传输控制协议) listen状态 accept和connect TCP_echo_server (1)创建套接字 (2)绑定 (3)设置listen状态 (4)loop (5)客户端 多线程远程…...
NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上
在当今智能化、数字化的时代,视频监控已经成为各行各业不可或缺的一部分,无论是公共安全、交通管理、企业监控还是智慧城市建设,都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中,将监控视频实时投放到大屏幕电视墙上…...
Springboot集成阿里云通义千问(灵积模型)
我这里集成后,做成了一个工具jar包,如果有不同方式的,欢迎大家讨论,共同进步。 集成限制: 1、灵积模型有QPM(QPS)限制,每个模型不一样,需要根据每个模型适配 集成开发思路: 因有…...
微信公众号(或微信浏览器)获取openId(网页授权)
下单支付需要openId 首先授权去拿到code --然后调用后太换取openId 1.去拿取code 下图中执行到window.location.href ( redirect_uri 传入当前路径-)–执行后重新跳转到当前页面–但是路径上会带上code参数 //然后调用后台方法–将code传给后台得到 o…...
C++算法第五天
本篇文章继续和大家一起刷算法题 第一题 题目链接 . - 力扣(LeetCode) 题目解析 题目要求: 这是一个连续的子数组 计算子数组内元素的和,若数组内元素的和符合 > target的值并且该子数组的长度是最短的,则返回…...
牛客网剑指Offer-树篇-JZ26 树的子结构
题目 来源:JZ26 树的子结构 描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下ÿ…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发六,使用SDLVSQT显示yuv文件
使用QT 显示YUV 文件 在最后一帧的时候会不停的显示最后一帧图片。 Vsqtshowyuv.h #pragma once#include <QtWidgets/QWidget> #include "ui_vsqtshowyuv.h" #include <sdl/SDL.h> #include <iostream> #include <fstream> #include <Q…...
Spring 设计模式之适配器模式
Spring 设计模式之适配器模式 适配器模式用到的场景java举例 适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作。 其核心思想是通过一个适配器类将不兼容的接口转换成客户端期望的另一个接口&…...
多传感器数字化分析系统
在工业飞速发展的今天,设备的安全稳定运行成为企业高效生产的关键因素。然而,传统的人工巡检方式面临着诸多挑战,如效率低下、漏检误检以及难以精准掌握设备运行状态等。旗晟凭借深厚的技术积累和创新精神,推出了多传感器数字化分…...
Java 基础教学:面向对象编程基础-封装、继承与多态
面向对象编程(OOP)是现代编程的重要范式,Java 语言提供了丰富的 OOP 特性,主要包括封装、继承和多态。本文将详细讲解这三个概念及其实现方式,并提供相应的代码示例。 1. 封装 1.1 概念 封装是将对象的状态…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
XXE漏洞知识
目录 1.XXE简介与危害 XML概念 XML与HTML的区别 1.pom.xml 主要作用 2.web.xml 3.mybatis 2.XXE概念与危害 案例:文件读取(需要Apache >5.4版本) 案例:内网探测(鸡肋) 案例:执行命…...


