5 free a bad data block导致机器死机问题咨询

发布于 2020-08-10 16:07:29

版本4.0.0,使用dataqueue进行消息收发,机器在运行过程中突然出现如下打印,机器死机:

to free a bad data block:
mem: 0x20008788, used flag: 0, magic code: 0x1ea0
(mem->used) assertion failed at function:rt_free, line number:599 

查看更多

关注者
0
被浏览
110
3 个回答
liu2guang
liu2guang 认证专家 2020-08-12

(mem->used) assertion failed at function:rt_free, line number:599

这句话的意思是 rt_free 传入的地址, 其对应的管理块中有一个标志是否使用的字段,在小内存管理算法下面会判断这个字段是否是已经被使用的,对应没有使用的情况有2种:

  1. 内存写穿,上一块内存写入数据越界导致数据被破坏
  2. 释放过的内存再次释放(释放一次后used会被标注为已经释放)

正对以上2种问题,一般断定和解决方法:

  1. 对应第一种内存写穿,可以开启memtrace功能,直接遍历一次内存使用的情况,内存管理块采用的链表结构,如果是内存写穿基本上链表就会被破坏,所以memtrace出来的有一个内存大小地址均是一个异常数据,那么基本这个异常的地址之前的一个或者n个地址有数据写穿。只需要debug找出谁分配的这块,分析前后关系即可解决这种问题;
  2. 针对于再次释放的问题,比较简单释放后将指针赋值为NULL,rt_free 释放空指针就会退出。当然找出重复释放的地方更好
JQRR_7669
JQRR_7669 认证专家 2020-08-10

有使用内存超边界,破坏了动态内存块参数

CrisJay
CrisJay 认证专家 2020-08-11

题主检查一下在调用 free 的时候传入的地址是否是已经释放过的内存地址,或者是非 malloc 动态申请的内存地址。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友