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

这篇具有很好参考价值的文章主要介绍了记录关于智能家居的路程的一个bug___Segmentation fault(段错误)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

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

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

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

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

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

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

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

有时候又没有段错误

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

找bug的过程:

第一次找:

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

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

解决思路:

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

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

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

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

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

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

第二次找:

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

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

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

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

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

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

解决思路:

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

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

第三次找:

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

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

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

解决思路:

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

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

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

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

但是不幸的是仍然是报错

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

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

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

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

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

还是报错!

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

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

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

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

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

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

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

if (gpio_status == 0)

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

但是仍然是报错!!!!

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

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

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

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

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

第四次找:

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

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

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

第五次找:

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

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

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

解决思路:

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

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

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

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

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

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

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

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

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

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

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

第六次找:

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

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

解决思路:

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

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

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

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

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

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

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

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

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

第七次找:

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

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

发现是正常的结果

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

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

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

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

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

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

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

解决思路:

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

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

发现也是正确的

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

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

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

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

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

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

第八次找:

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

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

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

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

解决思路:

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

此时添加 voive_gfevice 文件记录关于智能家居的路程的一个bug___Segmentation fault(段错误),智能家居,bug

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

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

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

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

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

更新于第二天:

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

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

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

记录关于智能家居的路程的一个bug___Segmentation fault(段错误),智能家居,bug文章来源地址https://www.toymoban.com/news/detail-852569.html

到了这里,关于记录关于智能家居的路程的一个bug___Segmentation fault(段错误)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【基于stm32f103C8T6-小程序智能家居项目实战-自绘PCB到实现功能一条龙+30分钟解决-各种bug已修复】

    【基于stm32f103C8T6-小程序智能家居项目实战-自绘PCB到实现功能一条龙+30分钟解决-各种bug已修复】

    阿熊智能家居演示 核心板 STM32F103C8T6 WIFI模块 ESP8266-01s 传感器 DHT11温湿度传感器 BH1750光照传感器 其他 LED OLED 4脚按键开关 CP2102(USB转TTL模块) 有源蜂鸣器(低电平触发) 金属膜电阻器 面包板(或PCB) 电源和导线 项目 数量 已购 价格 STM32F103C8T6 1 ESP8266-01s 1 DHT11温湿度传感器

    2024年04月28日
    浏览(13)
  • 你相信光吗?开源一个能进行虚拟光渲交互的全志D1s智能家居中控

    你相信光吗?开源一个能进行虚拟光渲交互的全志D1s智能家居中控

    本文所介绍产品demo是在立创开源平台的开源作品**《全志D1s智能家居中控虚拟光渲交互(86盒)》**,项目选用RISC-V核心的全志D1s作为主控进行开发,并通过家庭WIFI内网,实现设备间MQTT通信,与其它开源单片机控制项目进行充分联动, 旨在推广类似客制化键盘概念到智能家居领

    2024年02月02日
    浏览(13)
  • 智能家居(13)——智能家居控制系统

    灯光的控制:模拟客厅灯、餐厅灯、二楼灯、卫生间灯。灯光可以通过手机App、语音、控制开关。 家内发生火灾后报警功能。 温湿度检测通过服务器上传到手机App。 摄像头安全监控,将视频上传到手机App,并通过摄像头实现人脸识别智能开锁。 灯光通过普通IO口控制,自己

    2024年02月11日
    浏览(41)
  • 虚拟现实与智能家居:智能家居的未来

    随着科技的不断发展,我们的生活也在不断变化。智能家居是一种新兴的技术,它将人工智能、互联网和家居三者相结合,为我们的生活带来了更多的便利和舒适感。虚拟现实(Virtual Reality,简称VR)则是一种将人引入到计算机生成的虚拟世界中的技术,它可以让我们在不离开现

    2024年04月16日
    浏览(38)
  • Linux MQTT智能家居项目(智能家居界面布局)

    Linux MQTT智能家居项目(智能家居界面布局)

    1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件: 在工程目录下添加Icon文件夹保存图片: 将文件放入目录中: 将图片添加进入资源文件中: 这里我们一共显示4个界面:LED控制界面,温度湿度显示界面,光照强度显示界面,摄像头监测界面。 所以这里

    2024年02月13日
    浏览(15)
  • 基于智能家居控制器的智能家居智能化控制:基于强化学习技术

    引言 1.1. 背景介绍 随着科技的发展,智能家居逐渐成为人们生活中不可或缺的一部分。智能家居通过引入各种智能化设备,如智能门锁、智能照明、智能空调等,使人们的生活更加便捷、舒适。然而,智能家居的复杂性导致用户在控制过程中面临诸多困难,如操作复杂、界面

    2024年02月11日
    浏览(41)
  • 智能家居的另一种形式:智能家居中心的技术架构

    作者:禅与计算机程序设计艺术 随着智能设备的普及、互联网技术的飞速发展以及人们对智能家居产品的追求,越来越多的人选择将家居环境变成一个“智能”的地方,比如通过智能安防系统、智能遥控器、智能监控等方式帮助用户实现更加精细化的生活控制和场景管理。但

    2024年02月07日
    浏览(41)
  • 【OrangePi Zero2 智能家居】智能家居项目的软件实现

    【OrangePi Zero2 智能家居】智能家居项目的软件实现

    一、项目整体设计 二、项目代码的前期准备 三、实现语音监听接口 四、实现socket监听接口 五、实现烟雾报警监听接口 六、实现设备节点代码 七、实现接收消息处理接口 整体的软件框架大致如下: 整个项目开启4个监听线程, 分别是: 语音监听线程:用于监听语音指令,

    2024年02月22日
    浏览(13)
  • 智能家居(2)智能体验与智能交互

    智能家居(2)智能体验与智能交互

    随着信息和网络技术的发展,可以网络连接的电子电器产品越来越丰富,智能家居、智慧园区、智能汽车等智能控制系统和产品应用越来越广泛。 智能交互终端是智能控制系统的人机交互接口,既是实现智能功能的重要载体,也是用户感受智能化体验的关键节点。现有智能家

    2023年04月08日
    浏览(7)
  • 智能健康:智能家居带来健康保障

    作者:禅与计算机程序设计艺术 目前,全球70%-80%的家庭拥有自己的住房。在过去的几年里,智能化、绿色化的新型装修风格正在成为主流。传统的精英制造商已经开始把用户的注意力从生活中分离出来,转向家电、影音、纸尿裤等产品的消费。智能家居已经渗透到我们的生

    2024年02月11日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包