Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt_malloc
初始化
死机
RT-Thread 使用经验分享 :动态申请的内存未清零造成死机
发布于 2023-03-18 11:23:40 浏览:1128
订阅该版
[tocm] ## 前言 - 最近在开发调试基于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 操作。 - 有些操作可能运行一次并未发生死机等【当场就出现】的死机等错误,但是多次运行,错误累积起来,就会触发更严重的错误 - 代码编写时,规范化、充分测试非常有必要。 - 调试改善代码的时间往往比编写代码时间多很多,因此在代码设计编写时要多花点心思与时间,充分验证,减少后续问题的排查调试时间,提高工作效率。 ![2023-03-18_111847.png](https://oss-club.rt-thread.org/uploads/20230318/7f17f20ce9eccc000ba19b8c6fa45eb4.png) ## 小结 - 复杂点的数据结构,使用 动态内存申请后,建议直接 清零操作,以免默认的数据不是自己想要的,造成程序运行异常或者死机,简单的数据结构,如果能保证后面的操作把每个成员都赋值上,可以不清零 - 初始化、清零,这些简单的操作,也需要重视起来,以免耗费大量的软件排查与调试时间
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
张世争
学以致用
文章
131
回答
805
被采纳
174
关注TA
发私信
相关文章
1
加了bootloader后,为什么就卡死了
2
free a bad data block导致机器死机问题咨询
3
stm32f429上运行动态模块,加载运行死机
4
开启Iwdt看门狗,为什么还会“死机”(硬件干扰)
5
cmBackTrace定位后无法分析出问题原因
6
rt_timer_start 链表死循环
7
hard fault on thread: lcd_task 问题?
8
telnet功能开启之后,断开网线则死机
9
官方的定时器案例死机
10
RT-thread nano不能进入线程,好像死机了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部