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

    文章

    1368

    浏览量

    114704
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    10976
  • RTOS
    +关注

    关注

    22

    文章

    813

    浏览量

    119644
  • 堆栈溢出
    +关注

    关注

    0

    文章

    9

    浏览量

    7911

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

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

收藏 人收藏

    评论

    相关推荐

    智多晶EDA工具HqFpga软件实用小功能

    智多晶EDA工具HqFpga软件实用小功能增加啦,支持生成可调用网表的功能和ballmap功能。下面来给大家讲解一下如何通过HqFpga软件生成可调用的网表文件
    的头像 发表于 12-05 10:23 242次阅读
    智多晶EDA工具HqFpga<b class='flag-5'>软件</b>实用小功能

    OPA2132容易自激是什么原因导致的?

    万用表测量第5定会自激,就算放开表笔依然自激,如果再用表笔碰一下第7脚自激就没了,碰第5脚又自激。就是这种
    发表于 11-01 06:57

    电子元件在哪些情况下容易遭受静电破坏

    在当今的电子技术时代,电子元件和产品的可靠性至关重要。然而,静电放电(ESD)对电子产品构成了严重威胁,从生产到使用的全过程,电子产品都处于静电破坏的风险之中。本文将深入探讨电子元件在哪些情况下容易
    的头像 发表于 10-04 16:39 828次阅读

    什么情况下OPA541容易损坏?

    我打算用OPA541做个交流程控电压源,输出功率50W。OPA541采用开关电源供电±24V,OPA541采用数据手册上的接法,限流保护电阻为0.5欧。在5欧负载的情况下,输出电压有效值15V
    发表于 09-11 07:49

    请问一下INA333这个芯片很容易坏吗?

    大家好,请问一下INA333这个芯片很容易坏吗, 我的单电源3.3V供电。输入是正向1.0v,反向0.5v,ref接地,放大2倍,结果输出0.3V左右,是不是芯片坏了
    发表于 08-30 07:16

    plc什么情况下导致程序丢失

    PLC(Programmable Logic Controller,可编程逻辑控制器)是一种广泛应用于工业自动化领域的设备。它通过执行用户编写的程序来实现对机械设备的控制。然而,在某些情况下,PLC
    的头像 发表于 08-19 09:14 1360次阅读

    极限失控的大模型使电力系统面临的跨域攻击风险及应对措施

    分析大规模生成式预训练模型(以下简称为大模型)发生极限失控、使电力系统面临的跨域攻击风险及相关的应对措施,以期引起业内对这风险的重视、讨论与行动。基于大模型的现状、发展趋势以及它与人
    发表于 07-22 12:09 0次下载

    MOS管什么情况下会短路

    MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor,金属-氧化物半导体场效应晶体管)在多种情况下可能会发生短路,这些情况主要涉及其工作环境、操作条件、物理特性以及制造工艺
    的头像 发表于 07-16 11:39 3093次阅读

    总结一下LM317的几种经典应用电路

    说起LM317,我们做硬件的都很熟悉了,它是LDO的一种,并且输出电压很容易通过外部电阻进行调整,今天总结一下LM317的几种经典应用电路。
    的头像 发表于 05-01 10:07 5650次阅读
    总结<b class='flag-5'>一下</b>LM317的几种经典应用电路

    深圳恒兴隆机电|雕刻机电主轴导致容易损坏的原因.

    兴隆机电小编起来看看吧! 、雕刻机电主轴的质量问题在雕刻机电主轴越使用来越普遍的情况下,电主轴质量却参差不齐。买到质量特别差的主轴在高强度的工作环境
    发表于 04-01 11:03

    EMI(电磁干扰):原理、影响与应对措施

    EMI(电磁干扰):原理、影响与应对措施?|深圳比创达电子EMC
    的头像 发表于 03-26 11:22 2354次阅读
    EMI(电磁干扰):原理、影响与<b class='flag-5'>应对</b><b class='flag-5'>措施</b>?

    电源芯片短路恢复过冲的风险及应对措施

    可能导致设备无法正常使用。为了保护设备和提高电源芯片的可靠性,我们需要采取相应的应对措施。 首先,让我们先了解一下电源芯片短路和过冲的风险。短路是指电路中的两个节点之间出现低阻抗路径,
    的头像 发表于 02-06 09:46 2060次阅读

    晶振温度漂移:原理、影响因素与应对措施

    晶振温度漂移:原理、影响因素与应对措施 晶振温度漂移是指晶振器在不同温度频率发生改变的现象。晶振温度漂移是个晶振器的重要性能指标,特别是对于高精度和高稳定性要求的应用场合。了解晶振
    的头像 发表于 01-26 17:14 1558次阅读

    高压差分探头什么情况下容易坏?

    高压差分探头什么情况下容易坏? 高压差分探头是一种用于测量电气设备中的电压差异的仪器。它通常由两个金属电极组成,它们用于感测电场强度,并将其转换为电压信号。然而,由于其特殊的设计和工作环境,高压差分
    的头像 发表于 01-08 16:36 668次阅读

    温度很低的情况下,电机效率会降低吗?

    温度很低的情况下,电机效率会降低吗  电机在工业和家庭中广泛应用,其效率是评估其性能的重要指标之。然而,温度是影响电机效率的关键因素之。本文将探讨低温对电机效率的影响,并提出
    的头像 发表于 01-04 11:26 2173次阅读