【GDB调试】智慧中控项目的调试
一.在执行的智慧中控项目的时候,喊语音模块唤醒(小欣小欣)的时候遇到了:Segmentation fault 段错误

二.遇到段错误,一般是以下情况:
“Segmentation fault”(段错误)是Linux系统中常见的程序异常终止信号。它通常发生在程序试图访问一个未分配给它的内存区域或尝试以不允许的方式访问内存时。以下是一些可能导致段错误的常见原因:
-
空指针解引用:如果你的程序试图通过一个空指针访问数据,这将导致段错误。
-
数组越界:当你试图访问数组的一个不存在的位置时,例如,数组大小为10,而你试图访问第11个元素。
-
野指针:指向已经释放了的内存空间的指针被称为野指针,使用这样的指针可能会导致段错误。
-
栈溢出:当函数调用层次太深或者局部变量占用空间过大导致栈空间耗尽时,会发生栈溢出。
-
多线程问题:在多线程环境中,如果两个或多个线程同时访问并修改同一块内存而没有适当的同步机制,可能会导致段错误。
-
非法地址操作:如向只读内存写入数据等。
-
内存分配失败后继续使用:当
malloc()、calloc()等函数返回NULL值表示内存分配失败时,如果程序没有检查这个返回值而直接使用分配的内存,就会发生段错误。 -
结构体或对象的成员访问:当尝试访问一个未正确初始化的对象的成员时,也可能引发段错误。
解决段错误的方法包括但不限于:
- 使用调试器(如GDB)来定位错误发生的准确位置。
- 检查所有指针是否都被适当地初始化,并且在使用前确认它们不是NULL。
- 检查数组边界,确保不会越界访问。
- 对于动态内存管理,确保释放内存后不再使用该内存。
- 在多线程应用中,确保对共享资源的操作进行了适当的同步处理。
三.我如何解决?这里使用GDB去调试
1. 首先使用GDB去运行项目
用gdb去调试一般就这个步骤:
①在gcc后面加-g编译
②在前面加gdb去执行
③遇到(gdb)的时候,按r运行,再次遇到继续按r
④后面就会看到输出的结果,和程序奔溃的地方(哪个文件,哪行代码)。

2. 回到项目,找到发生错误的地方
①一般段错误就是指针的问题,经常要么是使用了空指针,要么就是指针越界了。
这里发现cur_gdev也是个指针,cur_gdv指针被拿去做了一些操作(被拿去做了if判断)。
并且这里看到cur_gdev一开始赋值是NULL,那这里就应该去看看cur_gdev后续是否有被到赋值。
如果cur_gdev没有被赋到值,又被拿去做了其它其它操作,就会出现段错误,那就是使用一个指向空的指针去跟其它的数据做if判断,就会出错。
所以这里开始怀疑cur_gdev是不是没赋到值?

②所以这里找到cur_gdev被赋值的代码(92行),看看cur_gdev有没有被赋到值。
在cur_gdev被赋值的代码下面加上一条printf语句打印一串数字(93行)。
执行看看会不会输出这行数字。如果输出这行数字,说明程序跑到这个printf语句了,那也就说明cur_gdev被赋值的语句也跑到了,说明cur_gdev被赋到值了。

③用GDB执行结果如下:
没看到输出我们加的那行代码88888888888(代码93行)?

3.继续去调试
①在输出888888的代码,后面加"\n"换行符试试:printf(“88888888888888888888\n”);

②老样子使用gdb编译、执行、按r运行

③老样子,在发生错误的地方,唤醒语音模块(喊小欣小欣)
④结果如下,看到了我们加的那行代码88888888888(代码93行)。说明cur_gdev被赋值的语句(92行),程序是有执行到的

4.继续调试,在有怀疑的地方继续加printf输出语句
①那cur_gdev被赋值的语句确实是有被执行到的,那我们在点进去看看给cur_gdev赋值的函数find_gdevice_by_key()点进去看看,cur_gdev有没有可能会被赋值为NULL。
cur_gdev = find_gdevice_by_key(phead_gdev,recv_msg->buffer[2]);
②看到find_gdevice_by_key()函数里面,这段代码的意思是:
如果链表头是空就返回空NULL,
否则就去遍历链表,
遍历完链表都没有找到需要return的那个p,我们就返回空NULL
发现确实有两个会返回return,那cur_gdev确实是有可能会被赋值为空NULL的。
所以我们给每个return前面加个printf输出语句(记得后面加\n)
然后继续唤醒语音模块(喊小欣小欣),
看看最后会打印出哪个printf输出语句,那就能侧面知道return的是什么给cur_gdev

③看到打印的是77777,那说明后面会return的是NULL空值给cur_gdev。证明了我们的猜想。


4.继续调试,在有怀疑的地方继续加printf输出语句
①回到前面,所以刚刚唤醒语音模块(喊小欣小欣)的时候,cur_gdev确实有可能被return返回一个空值NULL的,那这里却没有对cur_gdev是NULL的时候做什么处理,导致后面cur_gdev直接被拿去做if判断了,出现了段错误。

②那这里加个如果cur_gdev是NULL的时候的处理看看,继续验证猜想:cur_gdev是不是真的NULL。

③结果如下:
看到输出1111111111,再次证明cur_gdev确实是NULL。然后后面就被拿去做操作了,所以是空指针操作出现的段错误。

5. 所以按实际需要给cur_gdev做空指针处理,如果cur_gdev为NULL就怎么怎么样。
我这里是给如果cur_gdev是空指针,我就直接退出线程。

相关文章:
【GDB调试】智慧中控项目的调试
一.在执行的智慧中控项目的时候,喊语音模块唤醒(小欣小欣)的时候遇到了:Segmentation fault 段错误 二.遇到段错误,一般是以下情况: “Segmentation fault”(段错误)是Linux系统中常见的程序异常终止信号。…...
《一本书讲透 Elasticsearch》京东评论采集+存储+可视化全 AI 实现
经常和出版社编辑老师交流读者的反馈。毕竟是小众书籍,豆瓣评分的人并不多。 而京东作为主要读书销售渠道,非常有必要整合一下京东读者评论,看看读者们都说了什么,以便后续的改进! 一条条的翻看非常不方便,…...
uniapp中webview全屏不显示导航栏解决方案
uniapp官网文档地址:https://uniapp.dcloud.net.cn/api/window/window.html#getappwebview <template><view class"index"><u-navbar :is-back"true" title"标题"" :title-width"650"></u-navb…...
Dear ImGui 使用VS2022编译为静态库
Dear ImGui 是一个无臃肿的 C++ 图形用户界面库。它输出优化的顶点缓冲区,您可以在支持 3D 管道的应用程序中随时渲染这些缓冲区。它速度快、可移植、与渲染器无关且自成一体(无外部依赖项)。 Dear ImGui 旨在实现快速迭代,并让程序员能够创建内容创建工具和可视化/调试工具…...
5G 现网信令参数学习(3) - RrcSetup(1)
目录 1. rlc-BearerToAddModList 1.1 rlc-Config 1.1.1 ul-AM-RLC 1.1.2 dl-AM-RLC 1.2 mac-LogicalChannelConfig 2. mac-CellGroupConfig 2.1 schedulingRequestConfig 2.2 bsr-Config 2.3 tag-Config 2.4 phr-Config 2.5 skipUplinkTxDynamic 3. physicalCellG…...
PHP实现身份证OCR识别API接口
随着社会的发展,身份认证需求不断增长,这与身份证OCR识别技术的发展密切相关。在当今社会,各个领域都需要进行身份认证。传统的人工手动录入身份证信息费时费力,速度慢且容易出错,体验不佳。而身份证 OCR 识别技术通过…...
关于 Qt+Osg中使用背景图HUD受到后绘制几何图形顶点颜色影响 的解决方法
若该文为原创文章,转载请注明出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143607816 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…...
[CKS] K8S AppArmor Set Up
最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于AppArmor Pod操作权限的问题。 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] …...
redis笔记-数据结构
zset zset一方面它是一个 set,保证了内部value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。 zset的底层是由字典和跳表实现。 字典主要用来存储value和score的对应关系。跳表这个数据结构主要用来提…...
webpack的常见配置
Webpack 是一个现代 JavaScript 应用的模块打包工具,用于将项目中的多个文件和依赖打包成浏览器可以识别的文件,通常是一个或多个 JavaScript、CSS 或其他静态资源的 bundle(将多个模块或文件合并成一个或几个文件的过程,这些合并…...
text-embedding-ada-002;BGE模型;M3E模型是Moka Massive Mixed Embedding;BERT
目录 text-embedding-ada-002 一、模型概述 二、模型功能 三、模型特点 四、模型应用 五、模型优势 BGE模型 一、模型背景与特点 二、模型性能与表现 三、模型迭代与发展 M3E模型是Moka Massive Mixed Embedding 一、基本信息 二、技术特点 三、应用场景 四、性能…...
WebRTC 环境搭建
主题 本文主要描述webrtc开发过程中所需的环境搭建 环境: 运行环境:ubuntu 20.04 Node.js环境搭建 安装编译 Node.js 所需的依赖包: sudo apt-get update sudo apt-get install -y build-essential libssl-dev 下载 Node.js 源码: curl -sL htt…...
FastHTML快速入门:http方法,CSS文件和内联样式,其他静态媒体文件位置
HTTP方法 FastHTML通过函数名与HTTP方法进行匹配。到目前为止,我们定义的URL路由都是针对HTTP GET方法的,这是网页最常见的方法。 表单提交通常作为HTTP POST发送。在处理更动态的网页设计时,也就是所谓的单页应用(SPA࿰…...
项目管理和研发管理中的痛点及其解决方案
在现代企业中,研发管理和项目管理面临着多重挑战,包括资源配置不当、沟通不畅、目标不明确、进度控制困难等。这些痛点不仅影响项目的顺利推进,还可能导致企业在市场竞争中处于劣势。尤其是在资源配置不当方面,企业往往难以合理分…...
机器学习(基础1)
数据集 sklearn玩具数据集 数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取 sklearn现实世界数据集 数据量大,数据只能通过网络获取(为国外数据集,下载需要梯子) skle…...
我谈维纳(Wiener)复原滤波器
Rafael Gonzalez的《数字图像处理》中,图像复原这章内容几乎全错。上篇谈了图像去噪,这篇谈图像复原。 图像复原也称为盲解卷积,不处理点扩散函数(光学传递函数)的都不是图像复原。几何校正不属于图像复原,…...
怎么看真假国企啊?怎么识别假冒国企的千层套路?
一、怎么看真假国企啊? 1.使用具有迷惑性的名称:假冒国企往往在名称中使用“中国”、“中”、“国”等字样,或与知名国企名称相似的字号,以增加其可信度。 2.注册资本虚高:为了显示实力,假冒国企可能会在…...
C#中break和continue的区别?
在C#编程语言中,break和continue是两个用于控制循环流程的关键字,但它们的作用和用途有所不同。 break关键字 break关键字用于立即终止它所在的最内层循环或switch语句,并跳出该循环或switch块。程序执行将继续进行循环或switch语句之后的下一…...
Linux部署nginx访问文件403
问题描述:在linux服务器上通过nginx部署,访问文件403 新配置了一个用户来部署服务,将部署文件更新到原有目录下,结果nginx访问403 原因:没有配置文件的读写权限,默认不可读写,nginx无法访问到文…...
华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Python/JS/C/C++ 2024 C卷 200分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
