记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言

其实发生段错误的情况有很多:

其实在项目的开发中最有可能的错误就是①和②,考虑到本项目数组用的比较少,所以主要是考虑错误①指针的误用。

有时候错误就是那么离谱,声音也算是一种设备?????

出错原因:对语音模块发出开机的指令就会出现段错误,然后各种错误

有时候又没有段错误

找bug的过程:

第一次找:

怀疑是多线程的问题,把线程一个一个注释掉,发现第四个线程注释掉就不会出现“Segmentation fault”

解决思路:

对比其他三个线程的结构,有没有什么不一样。

对比下来发现,功能其实差的比较大,receive线程的主要目的是接收处理数据,而其他3个都是直接添加设备,果断转战下一个解决思路。 

ps:这里补充VsCode的一个对比工具“Partial Diff”插件

差异对比犀利手册:使用 Partial Diff 插件在 VSCode 中比较代码差异_vscode提交代码对比插件-CSDN博客

还补充了 gdb调试 的基本步骤

---------------------------------------------------------------------------------------------------------------------------------

第二次找:

在receive线程里面一句一句的排查注释,最终锁定一段代码、一句话

解决思路:

其实仔细一想,也不是这里的问题,这里只是初始化,情况内存,不是核心问题(因为此时的核心问题没有找,所以根本发现不了,只能挨着继续往下寻找)

---------------------------------------------------------------------------------------------------------------------------------

第三次找:

进一步排查,发现是该函数的memset的下面一句发生了错误,同样也发生了错误

解决思路:

排查到这句话,现在想起来其实是可以说明 cur_gdev->gpio_status 的状态是有问题的,只是当时不清楚,排查不到这里去。当时的解决思路完全是去纠结这里的语法去了

第一次改 :strcpy(change_status, cur_gdev->gpio_status == LOW ? "Open" : "Close");

修改的原因是:考虑字符串不能直接赋值。

但是不幸的是仍然是报错

所以又试了试不用三目运算符来写一下试试???

发现还是不行还是段错误。

继续考虑,会不会是指针没有分配到地址??

还是报错!

此时又回过头来考虑语法的问题

想了想 change_status 是一个指针,而 cur_gdev->gpio_status 是一个int类型,这两个能直接比较吗?

而且能够把字符串赋值给int类型的变量吗?现在想想都觉得当时写的很好笑

这个时候就应该考虑让 gpio_status 与一个数字作比较来判断高低电平

if (gpio_status == 0)

以及用 strcpy() 来对字符串赋值

但是仍然是报错!!!!

此时的报错原因 就是,语音模块的开机,“你好 小美” 就会出现段错误

没办法继续找吧,但是此时可以确定,该程序能不能跑到这里去

-------------------------------------------------------------------------------------------------------------------------------

第四次找:

还是把这段注释掉就不会崩,此时还是没有找到报错的核心问题

---------------------------------------------------------------------------------------------------------------------------------

第五次找:

第四次找的每一步都加上打印,最后确定查询到哪里停止

解决思路:

推荐方法 : printf("running %d \n",__LINE__); 

如果程序崩了的话就看看running停在了哪里 哪里就是问题所在 

现在可以基本上确定问题所在 “change_status”的数据没有,所以造成了错误,逐渐向真相靠近

并且把这一步注释掉,没有任何意义,根本copy不了,gpio_status 这玩意又不是指针,所以留着也没什么意义

这一句的作用就相当于上面那一句了

当删了这句话之后,程序往前跑了一步

此时说明 cur_gdev->gpio_status 的状态根本就是一个空白的数据!!!拿不到数据才会段错误(这个时候才算是真正的发现了出现段错的核心所在了)

---------------------------------------------------------------------------------------------------------------------------------

第六次找:

跟着往上发现是cur_gdev 这个指针有问题

解决思路:

打印该指针的  io状态 、以及 地址(先打印地址,没有地址的话哪来的io状态???

发现该指针的地址为空,这才是发生段错误的真相!根本就拿不到当前指针的地址,剩下的数据也不可能拿到

所以接下来的操作就是看看这个变量会经历什么过程,为什么会没有空间??

此时的核心问题已经转移到该函数 find_gdevice_by_key 上面

因为目前的状态就是该函数根本拿不到数据,打印出来的 cur_dgev 的地址就是一个空

此时就要进一步探讨这个函数的实现逻辑是怎么样的,对比了什么指令,对比指令,传入参数这些是否正确????

-------------------------------------------------------------------------------------------------------------------------------

第七次找:

打印 find_gdevice_by_key 的比对结果是怎么样的

发现是正常的结果

此时就要使用 gdb 调试,找到这个函数 打断点

多文件多函数打断点的方法 break myFile.c:myFunction 

得把其他的线程注释掉来调试

解决思路:

此时考虑 find_gdevice_by_key 的主要功能,在这个函数进行打印调试

发现也是正确的

除此之外还进行了其他的调试

没办法这些也不是最主要的点

第八次找:

考虑一件事(最原始的问题,最初的问题),为什么是开机就会发生段错误???

打开客厅灯不会发生段错误,为什么就开机会发生段错误???

解决思路:

这时候灵光一现!“你说声音会不会是一种设备?作为指令传入到被控设备链表之中”

此时添加 voive_gfevice 文件

奇迹的出现!真的没有报错了

至此,问题得到了解决,就是没有把声音当作一个设备,进行传入到当前的设备链表之中,所以造成了只有开机的时候才会发生段错误,因为没有添加开机设备的指令的时候,此时开机就没有指令传到被控链表之中,而find_gdevice_by_key 这个函数只会到当前已加入的设备链表中比对发送的指令,自然也就比对不到声音发过来的0x40这样一个指令,所以就会报错!

========================================================================

更新于第二天:

问题的核心其实还是cur_gdevice为空,但是还是要补充

其实上面的解决的bug只能够解决一时,真正想让项目运行起来的是解决办法是

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案

政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议,决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调:向科技要战斗力,加快推进“智慧消防”建设不断提升火灾防控…

大创项目推荐 深度学习 opencv python 实现中国交通标志识别_1

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

【LeetCode热题100】739. 每日温度(栈)

一.题目要求 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 二.题目难度…

pytest--python的一种测试框架--request请求加入headers

一、request headers中的cookie和session机制的作用与区别 Cookie 和 Session 是两种在客户端和服务器之间保持状态的技术。HTTP 协议本身是无状态的,这意味着服务器无法从上一次的请求中保留任何信息到下一次请求。Cookie 和 Session 机制就是为了解决这个问题。 …

【CASS精品教程】CASS11.0基于离散点创建三维地形(Tin、Grid、等高线)

文章目录 一、打开数据二、创建不规则三角网TIN三、创建等高线CONTOUR四、规则格网GRID五、专栏配套实验数据包下载一、打开数据 打开CASS11软件,点击【绘图处理】→【展野外测点点号】,选择实验数据(实验数据在文末有下载地址),如下图所示: 展点如下图所示(此数据为美国…

搜索与图论——Dijkstra算法求最短路

最短路算法 稠密图与稀疏图 n为点数,m为边数。m远小于n的平方为稀疏图,m接近n的平方为稠密图。 稀疏图用邻接表存,稠密图用邻接矩阵存 朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。 dijkstra函数实…

蓝桥杯算法题-图形排版

题目描述 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。   假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照图片顺序,在宽度 M 以内&…

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是()。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…

与webpack类似的工具还有哪些?区别?

文章目录 一、模块化工具二、详细对比RollupParcelSnowpackVitewebpack 参考文献 一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割,组织和打包应用。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来&a…

stitcher类实现多图自动拼接

效果展示 第一组: 第二组: 第三组: 第四组: 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…

P-MapNet:Far-seeing Map Generator Enhanced by both SDMap and HDMap Priors

主页:homepage 参考代码:P-MapNet 动机与出发点 在感知系统中引入先验信息是可以提升静态元素感知网络的上限的,这篇文章对SD地图采用栅格化表示(也就是图像形式),之后用CNN网络去抽取栅格化SD地图的信息&…

[技术笔记] Flash选型之基础知识芯片分类

1、按照接口分类 分为 Serial串口Flash 和 Parallel并口Flash; 市场大量使用Serial Flash;价格便宜;已满足系统对数据读写速度的要求; Serial Flash已经可以代表 NOR Flash; 小知识: 1)在…

CVPR 2024 | 风格迁移和人像生成汇总!扩散模型diffusion用于经典AIGC方向

风格迁移 1、DEADiff: An Efficient Stylization Diffusion Model with Disentangled Representations 基于文本到图像扩散模型在迁移参考风格方面具有巨大潜力。然而,当前基于编码器的方法在迁移风格时显著损害了文本到图像模型的文本可控性。本文提出DEADiff来解决…

54 npm run serve 和 npm run build 输出的关联和差异

前言 通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目 后者是编译当前项目, 然后做一下最小化代码的优…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 (一)随机变量 (二)全概率公式 (三)高斯分布及其性质 二、似然是什么? (一)概率和似然 (二)极大似然估计 …

牛客NC153 信封嵌套问题【中等 动态规划,最长递增子序列 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f 相同的题目: https://www.lintcode.com/problem/602 思路 本质是求最长子序列问题envelopes 先按 w 升序排序,再按 h 降序 排序,只需考虑h…

深入探讨分布式ID生成方案

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步&am…

当代深度学习模型介绍--循环神经网络(RNNs)

AI大模型学习 方向一:AI大模型学习的理论基础 模型和应用的多样化:随着研究的深入,深度学习领域出现了多种创新的模型架构: 卷积神经网络(CNNs)专门针对图像处理任务进行了优化,通过模拟生物视…

node.js项目初始化操作

项目环境Vscode 1.新建一个文件夹node.js(xx.js) 2.右键点击node.js,点击打开终端 我在VScode打开终端 输入npm init初始化项目没反应。 解决方法:进入文件夹node.js,出入cmd跳转到终端 重新输入npm init命令 正确结果如下图 后续命令按下…

卫星影像监测非农化,非粮化在农业中的应用

一、引言 随着卫星遥感技术的发展,卫星影像在农业领域的应用越来越广泛。然而,随着城市化进程的加速和农业结构的调整,卫星影像观测的非农化、非粮化现象也越来越突出。本文将重点探讨卫星影像观测非农化、非粮化的原因、影响以及应对策略。 …