【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刷题交流群,…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...