【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刷题交流群,…...
Scrapy爬取heima论坛所有页面内容并保存到数据库中
前期准备: Scrapy入门_win10安装scrapy-CSDN博客 新建 Scrapy项目 scrapy startproject mySpider03 # 项目名为mySpider03 进入到spiders目录 cd mySpider03/mySpider03/spiders 创建爬虫 scrapy genspider heima bbs.itheima.com # 爬虫名为heima &#…...
Kafka参数了解
Kafka配置参数完整说明 1. 基础配置 参数名说明推荐值参考值broker.idbroker的唯一标识符每个节点唯一的整数1delete.topic.enable是否允许删除topictruetruelistenersbroker监听地址SASL_PLAINTEXT://host:9092SASL_PLAINTEXT://172.24.77.15:9092advertised.listeners对外发…...
sql专题 之 where和join on
文章目录 前言where介绍使用过滤结果集关联两个表 连接外连接内连接自然连接 使用inner join和直接使用where关联两个表的区别总结 前言 从数据库查询数据时,一张表不足以查询到我们想要的数据,更多的时候我们需要联表查询。 联表查询我们一般会使用连接…...
day12:版本控制器
版本控制 使用到的命令: ls -al查看当前目录下的文件及文件夹mkdir新建目录rm -rf递归强制删除文件夹 一、安装配置 1、下载地址 Git 2、初始配置 #用户名 git config --global user.name "自定义用户名" #邮箱(公司的联系方式--追责&…...
第四十一章 Vue之初识VueX
目录 一、引言 1.1. vuex的概念 1.2. vuex使用场景 1.3. 优势 二、创建演示项目 2.1. 构建项目步骤 2.2. 项目最终生成结构 2.3. 创建项目文件 2.3.1. App.vue 2.3.2. Son1.vue 2.3.3. Son2.vue 三、创建一个空仓库 3.1. 安装vuex 3.2. 新建仓库 3.3. 挂载仓库…...
GIT的基本使用与进阶
GIT的简单入门 一.什么是git? Git 是一个开源的分布式版本控制系统,用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建,最初是为 Linux 内核开发而设计的。如今,Git 已经成为现代软件开发中…...
【Linux系统】—— 基本指令(二)
【Linux系统】—— 基本指令(二) 1 「alias」命令1.1 「ll」命令1.2 「alias」命令 2 「rmdir」指令与「rm」指令2.1 「rmdir」2.2 「rm」2.2.1 「rm」 删除普通文件2.2.2 「rm」 删除目录2.2.3 『 * 』 通配符 3 「man」 指令4 「cp」 指令4.1 拷贝普通…...
MFC工控项目实例三十实现一个简单的流程
启动按钮夹紧 密闭,时间0到平衡 进气,时间1到进气关,时间2到平衡关 检测,时间3到平衡 排气,时间4到夹紧开、密闭开、排气关。 相关代码 void CSEAL_PRESSUREDlg::OnTimer_2(UINT nIDEvent_2) {// if (nIDEvent_21 &am…...
【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件
Android Studio 版本 Android Java TextView 实现 点击事件 参考 import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast;public c…...
json转excel,读取json文件写入到excel中【rust语言】
一、rust代码 将json文件写入到 excel中。(保持json :key原始顺序) use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value, from_str}; use std::error::Error; use std::io::{self, Write}; use std::path::{Path}; u…...
织梦做企业网站/广东网站seo营销
弦生成器→d3.ribbon()。返回的函数使用二次贝塞尔曲线连接两个圆弧,以构成封闭的弦的路径数据。 从d3.ribbon()返回函数的作用来看,弦其实可分为两部分,一部分为两个圆弧,一部分为二次贝塞尔曲线。贝塞尔曲线是d3.ribbon()返回的…...
学校二级网站建设自查情况/拼多多关键词怎么优化
学习的主要是从文件读取数据、异常处理基本语法本节课学习如何使用Python向文本文件中写入数据、异常处理的深入补充将上课demo中的谈话内容(conversations)按角色(role)的不同,分别存入两个文本文件中 man [] #分别定…...
做app还是网站/深圳网站制作公司
PIC中档系列单片机,每条指令14位,共有35条汇编指令,根据操作对象不同,可将其分为三类: 字节操作类指令位操作类指令立即数与控制类操作指令1、字节操作类指令,以MOVF指令为例: 指令:…...
做外贸家纺资料网站/创建网站的基本流程
Hadoop离线是大数据生态圈的核心与基石,是整个大数据开发的入门。本次分享内容让初学者能高效、快捷掌握Hadoop必备知识,大大缩短Hadoop离线阶段学习时间,下面一起开始今天的学习! ▼往期内容汇总: 大数据导论Linux操…...
外贸b2b电子商务平台/优化外包哪里好
我们先来看一道BOSS直聘上面的选择题:你知道这道题选什么吗?-----------没错,选D如果你知道选D的原因,那你就不用往下面看了,节约你宝贵的时间;如果你不知道,那么你就要了解一个JS的知识点&…...
怎么做外网网站监控软件/企业新闻稿发布平台
作为Android开发的组成部分,多线程的作用举足轻重,先来说说应用场景 1多线程使用场景 1.1正常使用中,经常有子线程来更新界面UI的需求,但是安卓不允许子线程更新UI 使用子线程处理UI,若线程需要较长的时间,…...