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

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

3天内不再提示

嵌入式软件内存与指针相关问题

麦辣鸡腿堡 来源:嵌入式系统 作者:嵌入式系统 2023-12-07 16:07 次阅读

隐性的内存泄露问题

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。内存泄露是一个严重的慢性病,不会立即展现,但不知道未来的哪一天,所有的设备,会在相近的时间点爆发问题。

内存泄漏还会导致系统意外的重启,重启的原因可能千奇百怪。因此,检测和解决内存泄漏,就显得非常重要。

1. 泄漏的原因

内存泄漏主要是发生在堆内存分配方式中,即malloc方式中,申请的内存没有得到释放,或者对应的指针被被覆盖,内存直接泄漏。因为内存泄漏属于程序运行中的问题,无法通过编译识别,主要在程序运行过程中来判别和诊断。

2. 动态检测或监控是否内存泄露

监控系统内存,周期性监控堆中可用内存的大小,是检测系统是否有内存泄漏的最有效的手段。系统的内存短期会随着业务数据的变化而变化,但长期来看,可用的剩余可用内存会围绕一个中轴线上下波动,如果存在内存泄漏,其剩余可用内存随随着时间的推移逐渐减少。

3. 如何找到在哪儿内存泄露

可以使用工具检测代码中有没有静态的内存泄露,也可以在代码中增加标记,检测长期未释放的堆是谁申请的,在代码中查找。可以参考文章《动态内存管理及防御性编程》。

指针跑飞的问题

指针跑飞就是指针指向不正确的位置,指针未初始化或数组/指针越界访问,导致系统崩溃。

指针跑飞是常见的问题,问题很严重,但解决起来其实并不难,指针跑飞系统crash时,如果平台软件会打印出函数调用栈、segment fault错误、代码出错的地方、coredump文件等信息。有了这些信息,再分析源代码,其实是很容发现或找出当前代码中指针跑飞的原因的。

如果基于第三方的SDK开发,指针跑飞直接就重启,可能不会有任何提示,因此,最好能够在编码时就能够提前预防,而不是等待程序跑飞之后再定位解决 。

常见的手段:

1、熟悉和遵守代码编写规范,加强代码的评审,把问题消灭在编码阶段。

2、静态检测工具对代码进行检测。

3、增加边界性测试用例,一般指针异常是在边界或异常情形下发生的。

4、增加异常场景的测试,异常场景是违反常规的测试场景,这些异常业务场景,能够尽早shi发现隐藏的问题。

空指针的问题

空指针是“指针跑飞”的一种特殊情况,即指针为NULL,通常出现在指针用NULL值初始化后,在某些情况下没有给指针赋值,就直接使用指针范围内存。或者接收函数返回的指针变量,忽略了函数返回NULL的情形。

在使用指针前,检查指针是否为空,如果为空,在代码中执行异常处理流程,如打印出错信息,或者ASSERT,这样就可以避免引起更严重的问题,相对来说多使用一个if即可规避。

栈溢出导致的问题

栈溢出时会访问不存在的RAM空间,造成代码跑飞,这时无法得到溢出时的上下文数据,也无法对后续的程序修改提供有用信息。

函数递归调用,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出。函数内局部数组变量的内存空间过大,或者局部数组变量的下标范围溢出,破坏了栈空间中的内容。这种问题容易解决但初始不容易查到原因。如果是带操作系统的,一般系统内核会直接提示栈空间不足,将任务栈空间加大,或者不静态分配,用malloc动态创建,从堆中分配的。平时编码中禁止使用循环递归函数。

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

    关注

    8

    文章

    3020

    浏览量

    74008
  • 嵌入式软件
    +关注

    关注

    4

    文章

    240

    浏览量

    26642
  • 检测工具
    +关注

    关注

    0

    文章

    21

    浏览量

    2000
收藏 人收藏

    评论

    相关推荐

    #嵌入式软件设计 指针别名

    嵌入式指针嵌入式软件
    电子威廉希尔官方网站 那些事儿
    发布于 :2022年09月02日 23:25:02

    嵌入式软件工程师的内功修炼

    应用设计师(裸机或操作系统移植调度驱动API按照一定的算法逻辑实现相应的需求功能),嵌入式算法设计师(把相关数学算法设计成软件程序精准优化系统功能,如PID控算、卡尔曼滤波算法、低通滤波等)。C语言就是
    发表于 11-03 15:33

    嵌入式软件测试的秘诀

    嵌入式软件测试的秘诀:1、懂的使用工具;2、尽早发现内存问题(指针越界,数据类型超限等);3、深入理解代码优化;4、重现并隔离问题;5、确定测试的完整性;6、利用初学者的思维,去发现问
    发表于 10-27 07:38

    嵌入式软件是如何运行的?

    1. 上电复位、板级初始化阶段• 嵌入式系统上电复位后完成板级初始化工作。• 板级初始化程序具有完全的硬件特性,一般采用汇编语言实现。不同的嵌入式系统,板级初始化时要完成的工作具有一定的特殊性,但
    发表于 10-28 09:14

    嵌入式系统内存优化使用

    响应运行。并且经过实践证明,嵌入式系统内存优化使用,能够提升系统空间5%内存,确保系统顺利运行。【关键词】 嵌入式 Linux系统 内存优化
    发表于 11-04 06:23

    分享一些嵌入式系统编程中内存操作相关的避坑指南

    嵌入式系统的编程中,内存操作是我们常用到的,但往往也是易错的地方,怎么避免呢,今天给大家分享一些相关的避坑指南。数据指针...
    发表于 12-17 07:18

    嵌入式指针相关资料分享

    一:嵌入式指针(embedded pointer) (1.1)嵌入式指针概念 一般应用在内存相关
    发表于 12-20 07:11

    使用后嵌入式指针的方法

    通过嵌入式指针,进行改进,提高效率#include#includeusing namespace std;namespace myf{//嵌入式指针class B{private: i
    发表于 12-20 06:06

    嵌入式Web访问时的内存丢失问题

    嵌入式Web访问时的内存丢失问题 由于嵌入式威廉希尔官方网站 的发展,嵌入式Web服务器软件越来越大,对硬件的要求也相应地提高,但在工业现场的底层控制中
    发表于 11-20 09:41 605次阅读
    <b class='flag-5'>嵌入式</b>Web访问时的<b class='flag-5'>内存</b>丢失问题

    嵌入式软件是什么意思_嵌入式软件的分类有哪些

    本文首先阐述了嵌入式软件的概念,其次介绍了嵌入式软件的特征,最后介绍了嵌入式软件的分类。
    发表于 08-31 15:54 1.6w次阅读

    嵌入式软件的开发流程_嵌入式软件的调试

    本文首先介绍了嵌入式软件的发展,其次阐述了嵌入式软件的开发流程,最后介绍了嵌入式软件的调试。
    发表于 08-31 16:02 6290次阅读

    嵌入式系统的内存指针操作

    到处理器的内存空间中。在x86系统中,分为内存和I/O映射两种内存;在ARM体系中,全部的地址都在32位的内存空间中,所有的操作都是对32位地址空间
    的头像 发表于 08-27 11:33 6197次阅读

    嵌入式软件测试总结

    嵌入式软件测试的秘诀:1、懂的使用工具;2、尽早发现内存问题(指针越界,数据类型超限等);3、深入理解代码优化;4、重现并隔离问题;5、确定测试的完整性;6、利用初学者的思维,去发现问
    发表于 10-20 19:21 2次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>测试总结

    嵌入式技能树】

    程师嵌入式硬件工程师通用技能树软件C/C++语言编程经验、编程能力、应用开发、OOP面向对象编程方式、软件框架、C指针、文件IO、进程线程、高级IO、对C++中的智能
    发表于 10-21 10:21 16次下载
    【<b class='flag-5'>嵌入式</b>技能树】

    嵌入式软件概述及相关测试特点

    概述:什么是嵌入式软件?与传统软件不同,嵌入式软件需要将软件分析、设计、编码后烧录至硬件环境中才
    发表于 10-21 11:36 13次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>概述及<b class='flag-5'>相关</b>测试特点