嵌入式技术论坛
直播中

訾存贵

7年用户 920经验值
私信 关注
[问答]

AT组件的EC20的urc_recv_func函数会不会有内存泄漏的问题?

在AT组件的EC20模块中的at_socket_ec20.c文件的第818行开始的urc_recv_func函数中,第847行是
recv_buf = (char *) rt_calloc(1, bfsz)
每次进来都会申请内存,我没有找到在哪里释放recv_buf的,我跟了一下,recv_buf每次申请的地址是不一样的,同步跟着rt_free函数,也一直没有看到对以前申请到的内存地址的释放动作,我在SHELL里用free看内存的使用情况,确实是随着数据的进来是在一直增加的。
我还做了一下实验,recv_buf刚申请的时候,我马上rt_free,是没问题的,但是到函数尾部,接收到的数据处理完了,再加个rt_free,就显示ASSERT错误,说该内存未被使用,mem->used=0。既然大家都在用,那这部分肯定是没问题的,
我就想请教一下,我在SHELL里看到的内存泄漏的情况到底是不是因为这里?
recv_buf到底是在哪里被free的?为什么我手动free是不行的?多谢了。。。
1.jpg
2.jpg

回帖(2)

杜喜喜

2023-5-11 11:11:25
at_recvpkt_node_delete 这个函数删除了申请的空间。
至于 shell 里面发现的内存泄露问题,可以使用 memtrace 功能查找,这个功能可以在配置开启。
memtrace 可以显示出申请内存的线程是什么,便于分析。
1.jpg
举报

杜喜喜

2023-5-11 11:11:45
这个会把线程名称只显示 4 个字节,这个名称,是线程的名称。
你可以把 memtrace 里的信息先粗略过一遍;找到内存泄漏的一些部分信息;找到几个可能性比较高的,把线程名称起得容易分辨一些。可以先看看内存泄露的是哪些可能的线程。
测试次数多一些,一两次肯定不够
举报

更多回帖

发帖
×
20
完善资料,
赚取积分