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

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

3天内不再提示

RT-Thread使用经验分享:动态申请的内存未清零造成死机

冬至子 来源:张世争 作者:张世争 2023-10-08 14:59 次阅读

前言

最近在开发调试基于RT-Thread 的程序时,遇到一个比较奇怪的死机问题,后来经过一步步排查,终于发现是动态内存申请的数据结构没有清零引发的死机。

排查方法

由于没有单步调试的手段,就通过 打印调试LOG 与 #if 0 A_CODE #else B_CODE #endif 条件编译的方式,通过注释部分代码等方法,快速缩小问题的排查范围。

最终逐步排查,定位在内存资源释放的函数部分 xxfree,也就是程序执行完了,释放动态申请的内存时,触发了死机,注释掉这部分代码,不死机了,不过这样会造成【内存泄露】

通过查看代码继续排查,xxfree 函数设计的没有问题,所有指针都有判空操作,也就是只会 free 非空的指针,但是这种必现的死机,就几段内存 free 的代码,排查应该容易,所以增加了些LOG,并且把 free 时的指针地址也打印出来,确认是否 free 了不属于自己的指针或者重复 free 指针。

问题定位

在 xxfree 函数 增加多行 LOG后,再次运行死机后,我看了一下死机后的 LOG 信息,瞬间找到了方向,原来 free 的指针不是NULL,而是 0xffffffff,怪不得会死机!

通过全局搜索这个指针成员,竟没有发现赋值的地方,也就是没有赋值,希望它为 NULL,而它实际上是 0xffffffff。

这个指针附属于一个大的结构体,这个结构体是通过 malloc 方式动态内存申请的,但是没有【清零】操作,并且后续的操作中,这个指针成员由于某种条件下,没有代码执行到赋值,默认【野指针】。并且这个板子动态申请的内存默认不是0x00,而是 0xff,所以 free 了 非空的野指针触发死机

解决方法:malloc 后的数据结构,增加 memset 清零操作,这样保证指针成员默认为 NULL,如果是野指针, 并且free 时不为 NULL,会造成释放内存操作异常,大概率触发死机。

触累与排雷

继续排查驱动里面,有几处也是通过动态内存申请 malloc 数据结构 后,也没有 memset 清零,并且里面有 链表成员,链表也没有初始化,并且【侥幸成功】的挂上了 链表头 head 上,没有触发死机。

由于 资源释放这个操作一般都发生在【游戏结束】后,也就是代码不运行了,所以没有特别的注意,即使链表的成员没有清零操作,指针为野指针,也能 插入到 链表头,但是当多次这种操作后,就会触发内存异常,因为没有【清零】的内存空间,数据可能不是零,在地雷的旁边走,就有踩上去的机会!

加了 memset 清零操作后,果然触发了几个死机,并且牵出来 【链表未初始化】 就直接使用的 BUG 操作。

有些操作可能运行一次并未发生死机等【当场就出现】的死机等错误,但是多次运行,错误累积起来,就会触发更严重的错误

代码编写时,规范化、充分测试非常有必要。

调试改善代码的时间往往比编写代码时间多很多,因此在代码设计编写时要多花点心思与时间,充分验证,减少后续问题的排查调试时间,提高工作效率。

1.jpg

小结

复杂点的数据结构,使用 动态内存申请后,建议直接 清零操作,以免默认的数据不是自己想要的,造成程序运行异常或者死机,简单的数据结构,如果能保证后面的操作把每个成员都赋值上,可以不清零。

初始化、清零,这些简单的操作,也需要重视起来,以免耗费大量的软件排查与调试时间。

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

    关注

    1

    文章

    24

    浏览量

    7918
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38894
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(二、RT-Thread内核启动流程)

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4420次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动流程)

    RT-Thread内核简介

    STM32 程序的内存分布6、RT-Thread 自动初始化机制8、RT-Thread 内核对象模型静态对象和动态
    发表于 08-06 07:44

    RT-Thread系统动态内存堆有哪几种管理算法呢

    内存块。需要注意的是,在使用完动态内存之后,应该将其释放掉。否则,会出现内存泄漏的问题。1. 分配和释放内存RT-Thread 系统提供的
    发表于 03-31 13:53

    关于RT-Thread内存管理的内存池简析

    ,即当内存池中无可用内存块时,其申请线程允许等待,申请线程将挂起在 suspend_thread 链表上。
    发表于 04-06 17:02

    关于RT-Thread动态内存堆管理简析

    内存堆管理操作有以下几种:初始化、申请内存块、释放内存块。需要注意的是,在使用完动态内存之后,应该将其释放掉。否则,会出现
    发表于 04-06 17:11

    RT-Thread开发,如何有效学习RT-Thread的五个步骤

    RT-Thread推出RT-Thread Inside战略开放RT-Thread开发平台授权合作,与硬件十万个为什么合作首次推出第一款RT-Inside的开发板——iBox物联网开发套
    的头像 发表于 09-25 09:55 3.4w次阅读
    <b class='flag-5'>RT-Thread</b>开发,如何有效学习<b class='flag-5'>RT-Thread</b>的五个步骤

    基于STM32F4和RT-Thread通用BootLoader使用经验

    基于STM32F4、RT-Thread通用BootLoader使用经验
    的头像 发表于 02-27 17:23 5685次阅读
    基于STM32F4和<b class='flag-5'>RT-Thread</b>通用BootLoader使用<b class='flag-5'>经验</b>

    2022 RT-Thread全球技术大会:萤石EZIOT SDK对RT-Thread的支持

    2022 RT-Thread全球技术大会:RT-Thread在摄像头及IoT设备上的实践经验分享
    的头像 发表于 05-27 11:08 1073次阅读
    2022 <b class='flag-5'>RT-Thread</b>全球技术大会:萤石EZIOT SDK对<b class='flag-5'>RT-Thread</b>的支持

    RT-Thread记录(八、理解RT-Thread内存管理)

    记得最初学习 RT-Thread ,对于内存管理我也是简单看看然后一笔带过,当时觉得用不上,在我做的一些传感器单品项目上,对于内存管理确实知道与不知道没什么关系,但是随着认知的增长,项目复杂程度增加,发现
    的头像 发表于 06-23 10:11 1781次阅读
    <b class='flag-5'>RT-Thread</b>记录(八、理解<b class='flag-5'>RT-Thread</b><b class='flag-5'>内存</b>管理)

    RT-Thread学习笔记 RT-Thread的架构概述

    RT-Thread 简介 作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS
    的头像 发表于 07-09 11:27 4001次阅读
    <b class='flag-5'>RT-Thread</b>学习笔记 <b class='flag-5'>RT-Thread</b>的架构概述

    RT-Thread学习笔记】用memwatch排除内存泄露

    RT-Thread学习笔记】使用memwatch排除内存泄露
    的头像 发表于 07-30 14:01 1730次阅读
    【<b class='flag-5'>RT-Thread</b>学习笔记】用memwatch排除<b class='flag-5'>内存</b>泄露

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_内存管理

    RT-Thread文档_内存管理
    发表于 02-22 18:30 0次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>内存</b>管理

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    RT-Thread使用经验分享:链表未初始化造成死机

    最近在开发调试基于RT-Thread 的驱动时,遇到一个比较奇怪的死机问题,后来经过一步步排查,终于发现是驱动的链表节点没有初始化造成死机
    的头像 发表于 10-08 14:49 477次阅读
    <b class='flag-5'>RT-Thread</b>使用<b class='flag-5'>经验</b>分享:链表未初始化<b class='flag-5'>造成</b><b class='flag-5'>死机</b>