rt_free 返回plug_holes ASSERT错误

发布于 2020-08-19 12:33:42

free 一段内存时, 提示 ASSERT (mem->used == 0) 失败, 看源码是因为刚把 mem->used 置零以后, 又不知道被哪里置1,

通过在rt_free plug_holes(mem); 之前加了 while(i++ < 100), 更容易捕捉到这种修改, 发现是malloc 对其进行的修改,

不明白free 刚设置 mem->used = 0,之后, 为什么malloc还能继续操作这部分数据, 不是又sem吗?

感谢能解答,谢谢

查看更多

关注者
1
被浏览
143
3 个回答
aozima
aozima 2020-08-19
拒绝白嫖,拒绝键盘侠!

从经验上来看,出这个问题 99.99%是重复释放或内存写穿。
建议楼主先分析下是否可能有写穿现象,特别是前1块内存。

如果查不出来,后面可能需要上 memtrace 和 memcheck

iamyhw
iamyhw 2020-08-20

排查下这种情况,问题不在rt_free,可能使用rt_malloc的某段代码处于临界区。

niuxin
niuxin 2020-08-20

临界区是指中断里面吗? malloc 都是线程里面调用的, 线程A(优先级低, 25) 调用malloc,rt_hw_disable, 插入链表 rt_hw_enable , 线程B(tsh优先级,默认是20)调用rt_hw_disable, 插入链表(自己写了个双向链表), rt_hw_enable, free, 感觉 free时候malloc 还能进入, head_sem没有起作用的样子,

撰写答案

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

发布
问题

分享
好友