0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

讲解一下容易导致软件问题的5种情况以及应对措施

工程师邓生 来源:玩转单片机与嵌入式 作者:风雨无阻 2022-09-05 17:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在进行产品开发或者软件设计时,有没有遇到过下面的这种情况:

程序本来运行的好好的,莫名其妙的就出现了bug,但是还找不到出现bug的规律?

已经验证好的产品,到客户那里突然出现了问题?

出现的bug总是莫名其妙,找不到规律,感觉像“幽灵”一般的存在?

增加了一行无关的代码,程序就不能运行了?

其实,有的时候,问题原因会以一种微妙的方式影响代码的存在,今天我们重点讲解一下难以发现的、容易导致软件问的5种情况,以及所对应的应对措施。

01

堆栈溢出

肯定很多程序员都非常了解“堆栈溢出”这种情况。堆栈溢出可能会对数据或者指令造成破坏,从而影响程序的正确运行。 并且,发生堆栈溢出这种错误,在嵌入式设备程序中造成的影响比计算机中更大。通常有以下几种原因:

1、嵌入式系统通常使用较少的RAM

2、通常没有可依赖的虚拟内存(因为没有磁盘)

3、基于RTOS任务的固件设计使用多个堆栈(每个任务一个),每个堆栈的大小必须足够大,以确保不受唯一最坏情况堆栈深度的影响

4、中断处理程序可能会尝试使用这些堆栈 在进行相关测试的时候,有的时候堆栈溢出这种错误我们并不能测试出来,这就造成了:经过测试验证的程序,到客户处突然运行异常了。

为了避免发生堆栈溢出这种错误,我们可以通过自上而下的代码控制流分析方法,来证明代码是否会出现堆栈溢出错误。

避免措施:

1、确定好自己程序定义的堆栈的全部空间地址;

2、在临近堆栈的位置,定义固定地址的数组或者数据;

3、在程序中实时检查数组或者数据的值,若发现数据改变,证明发生了堆栈溢出,增加特殊的处理姿势:如让设备进入到特定的安全模式,或者输出当前的PC地址等。

02

竞争条件

在程序运行过程中,大量的、无序的任务一直在运行,但是资源是有限的,两个不同的任务之间可能就存在竞争资源的情况,由于两个或者多个进程竞争使用不能被同时访问的资源,使得这些进程有可能因为时间上推进的先后原因而出现问题,这叫做竞争条件。

条件竞争就是两个或者多个进程或者线程同时处理一个资源(如全局变量、文件等)产生非预想的执行效果,从而产生程序执行流的改变,从而达到攻击的目的。

防止条件竞争的方法如下:

1、采用某种保护机制来保护数据(如互斥体),确保只有进行修改的线程才能看到不变量被破坏时的中间状态;

2、使用无锁编程

3、使用事务来处理更新,将数据和读取都存储到事务日志中,然后将之前的操作合并为一步,再进行提交。当数据被另一个线程修改后,或处理已经重启的情况下,提交就会无法进行。

03

不可重入函数

首先需要区分什么是可重入什么是不可重入函数?

可重入函数:可重入函数可以由多个任务并发使用,而不必担心数据错误

不可重入函数:不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)

一些常见的不可重入函数的情形:

函数中使用了静态变量,无论是全局变量还是局部静态变量

函数返回静态变量

函数中调用了不可重入函数

函数体内使用了静态的数据结构

函数体内调用了malloc()或者free()函数

函数体内调用了其他标准I/O函数

函数是singleton中的成员函数而且使用了不使用线程独立存储的成员变量

总得来说,如果一个函数在重入条件下使用了未受保护的共享资源,那么他就是不可重入的。

例如两个函数func1和func2都是不可重入函数:对多线程条件下,操作系统会在func1还没有执行完的情况下,切换到另一个线程中,那个线程可能再次调用func1,这样状态就错了。

避免措施:

在每个库或驱动程序模块中创建并隐藏一个本质上不可重入的互斥锁。将此互斥锁的获取作为操作整个模块中使用的任何持久数据或共享寄存器的先决条件。

04

优先级翻转

优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。

比较经典的由于优先级翻转造成的事故就是当年的火星探路者号,就由于,此处所说的,优先级反转,而导致了内部执行逻辑出错的bug。

在1997年7月4号发射后,在开始搜集气象数据之后没几天,系统(无故)重启了。后来,当然,被相关技术人员找到问题根源,就是,这个优先级反转所导致的,然后修复了此bug。

解决措施:

1、优先级天花板

优先级天花板是当线程申请某资源时,把该线程的优先级提升到可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断,不管线程是否阻塞了高优先级线程的运行, 只要线程访问共享资源都会提升线程的优先级。

2、优先级继承

优先级继承是当线程A申请共享资源Source时,如果共享资源Source正在被线程C使用,通过比较线程C与自身的优先级,如发现线程C的优先级小于自身的优先级, 则将线程C的优先级提升到自身的优先级,线程C释放资源Source后,再恢复线程C的原优先级。这种方法只在占有资源的低优先级线程阻塞了高优先级线程时才动态的改变线程的优先级。

05

内存泄漏

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

解决措施: 当申请了动态区域,用完的时候一定要记得释放(free),如果没有释放,那么这块内存区域就将处于不可用状态(就像占着茅坑不拉屎一样),程序大了或运行久了就极有可能会导致内存的泄露(重启一下就能解决90%的问题根源),同时我们在释放的时候也要注意释放的内存只能释放一次,不要重复的释放,有的时候代码量会比较大,所以有可能会在不止一处地方进行了代码的释放操作。因为我们内存释放了一次后,该内存区域就有可能用来做别的事了,如果这时候我们又再释放一遍就很有可能会出现问题了。释放完之后最好把指针指向空地址,避免下次再使用指针的时候出现地址的错误。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1398

    浏览量

    119831
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    11417
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122613
  • 堆栈溢出
    +关注

    关注

    0

    文章

    10

    浏览量

    8098

原文标题:不要以为莫名其妙的bug是玄学!介绍5个引起程序隐藏bug的原因以及预防措施。

文章出处:【微信号:精通单片机与嵌入式,微信公众号:精通单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32 MCU在高频率运行的系统稳定性的提升方案

    问题,并提出系列应对措施,包括硬件设计改进和软件优化策略,以确保系统在高频工作环境中的可靠性和持续稳定运行。 具体内容包括: 高频运行对MCU的影响分析: 探讨CW32 MCU
    发表于 12-04 08:04

    rtthread_studio 使用lwip软件包变异报错,是什么原因?

    最近学习使用rtthread_studio 开发stm32f407网络通信,打开lwip软件包,结果变异报错,网上查了一下,没人遇到过这个情况,好像简单设置一下就能编译通过,怎么我这就
    发表于 10-13 07:59

    激光锡焊出现气孔的原因及应对措施

    激光锡焊有很多优点,高效,快速等等。但是在激光锡焊的过程中,可能因为这样或者那样的原因,造成焊接点存在气孔。松盛光电来给大家介绍一下激光锡焊焊点气孔存在的原因及相应的解决方案,来了解一下吧。
    的头像 发表于 08-18 09:22 868次阅读

    变压器过负荷如何处理,五个应对措施让你轻松应对

    变压器是电力系统中非常重要的设备之,用于电压变换,但在实际使用时,变压器会遇到负荷的情况,若不及时处理,会导致变压器过热,缩短其使用寿命,甚至引起变压器损坏,那么当变压器过负荷时,我们应该采取哪些
    的头像 发表于 08-15 15:10 873次阅读
    变压器过负荷如何处理,五个<b class='flag-5'>应对</b><b class='flag-5'>措施</b>让你轻松<b class='flag-5'>应对</b>

    大家都在用什么AI软件?有没有好用的免费的AI软件推荐一下

    大家都在用什么AI软件?有没有好用的免费的AI软件推荐一下?直接发个安装包,谢谢。比如deepseek、Chatgpt、豆包、阿里AI、百度AI、腾讯AI,哪个能用、好用?没找到安装包,都是在线搜索?想要Windows版本和IO
    发表于 07-09 18:30

    “碰一下”支付终端应用在酒店:智能无卡入住与客房控制

    “碰一下”支付终端和“碰一下”支付机具今年已在各种餐饮零售门店推广应用。就连天波小编家附近的村口小超市也用上了“碰一下”支付终端。近日,卤味龙头企业绝味食品宣布,全国门店将接入“支付宝碰一下
    的头像 发表于 07-04 09:57 627次阅读
    “碰<b class='flag-5'>一下</b>”支付终端应用在酒店:智能无卡入住与客房控制

    如何应对步进电机的各种干拢问题

    步进电机的干扰问题是个复杂且常见的话题,这些干扰可能来源于步进电机本身,也可能来自外部环境。为了有效地应对这些干扰,可以从以下几个方面进行考虑和解决。 、步进电机对外部的干扰及其应对
    的头像 发表于 05-11 17:38 872次阅读
    如何<b class='flag-5'>应对</b>步进电机的各种干拢问题

    rtthread_studio使用lwip软件包变异报错是什么原因导致的?

    最近学习使用rtthread_studio 开发stm32f407网络通信,打开lwip软件包,结果变异报错,网上查了一下,没人遇到过这个情况,好像简单设置一下就能编译通过,怎么我这就
    发表于 03-05 09:09

    请问一下DLPC3439的控制器,软件编写工具是什么?以及下载地址是什么?

    请问一下DLPC3439的控制器,软件编写工具是什么?以及下载地址是什么? 非常感谢
    发表于 02-24 07:10

    在Linux安装软件有哪些方法

    里面没有 apt 或者 yum 的时候,先看下系统的发行版。 以我的 Ubuntu 为例,第步选择个合适的源,第二步更新软件包列表,第三步安装软件包,超级简单。 如果不知道
    的头像 发表于 02-08 09:41 1022次阅读

    “碰一下”支付背后的4G技术

    不知道你是否有留意,近期,在线下支付场景中,多了个支付宝“碰一下”支付的设备,只需要“解锁手机—碰一下—确认”即可完成支付,对比打开付款码支付,步骤确实更加简洁。
    的头像 发表于 01-03 16:27 5010次阅读

    支付宝发布新代AI视觉搜索“探一下

    轻松实现对感兴趣事物的快速识别与搜索。只需打开支付宝,利用摄像头对准目标,无论是花草宠物、潮玩收藏,还是旅游景点的随身讲解,甚至是商品药品的详细信息,都能迅速获取。此外,“探一下”还具备趣味解读功能,能够为用户解读萌
    的头像 发表于 12-31 10:49 951次阅读

    集成电路电磁兼容性及应对措施相关分析() 电子系统性能要求与ESD问题

    此专题将从三个方面来分享:、电子系统性能要求与ESD问题二、集成电路ESD问题应对措施三、集成电路ESD测试与分析工业、消费及汽车电子模块开发的EMC问题会导致极高的开发成本和时间浪
    的头像 发表于 12-19 18:51 1061次阅读
    集成电路电磁兼容性及<b class='flag-5'>应对</b><b class='flag-5'>措施</b>相关分析(<b class='flag-5'>一</b>) 电子系统性能要求与ESD问题

    集成电路电磁兼容性及应对措施相关分析(二)—集成电路ESD问题应对措施

    至关重要。预防措施能够将 ESD 抗扰度提高到约 15kV,这表明通过合理的设计和防护,可以有效降低 ESD 对电子模块的影响 二、ESD问题应对措施 ESD 测试只能在成品部件上进行,这是因为只有在整个部件完成开发和生产后,才
    的头像 发表于 12-18 09:44 901次阅读
    集成电路电磁兼容性及<b class='flag-5'>应对</b><b class='flag-5'>措施</b>相关分析(二)—集成电路ESD问题<b class='flag-5'>应对</b><b class='flag-5'>措施</b>

    集成电路电磁兼容性及应对措施相关分析() — 电子系统性能要求与ESD问题

    此专题将从三个方面来分享: 、电子系统性能要求与ESD问题 二、集成电路ESD问题应对措施 三、集成电路ESD 测试与分析 工业、消费及汽车电子模块开发的 EMC 问题会导致极高的开
    的头像 发表于 12-17 09:24 808次阅读
    集成电路电磁兼容性及<b class='flag-5'>应对</b><b class='flag-5'>措施</b>相关分析(<b class='flag-5'>一</b>) — 电子系统性能要求与ESD问题