Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
memtrace
内存泄漏leak
内存泄露调试笔记一例
发布于 2015-01-14 17:44:35 浏览:643
订阅该版
刚好碰到一内存泄露问题,但不知道是谁泄露了,翻出之前调试用过的代码改了一下,很快找到泄露者了。 先是对mem.c进行改造,给每个node加入更多信息,以方便追溯。 ```diff src/mem.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/mem.c b/src/mem.c index 004de01..5f83700 100644 --- a/src/mem.c +++ b/src/mem.c @@ -112,6 +112,11 @@ struct heap_mem rt_uint16_t used; rt_size_t next, prev; + + rt_tick_t tick; + char thread_name[12]; + char file_name[128]; + int line; }; /** pointer to the heap: for alignment, heap_ptr is now a pointer instead of an array */ @@ -230,6 +235,45 @@ void rt_system_heap_init(void *begin_addr, void *end_addr) lfree = (struct heap_mem *)heap_ptr; } +static void mem_dump(void) +{ + const struct heap_mem * mem; + int count = 0; + rt_tick_t tick; + + rt_enter_critical(); + + tick = rt_tick_get(); + + mem = (struct heap_mem *)heap_ptr; + + rt_kprintf("mem_dump heap_ptr:0x%08X heap_end:0x%08X ", (int)heap_ptr, (int)heap_end); + while(mem < heap_end) + { + rt_kprintf("mem #%d: 0x%08X ", count, (int)mem); + rt_kprintf("magic: %04X %s ", mem->magic, (mem->used)?"used":"free"); + //rt_kprintf("size %d ", (int)()); + + if(mem->used) + { + rt_kprintf("thread: %s, age %d ", mem->thread_name, tick - mem->tick); + rt_kprintf("%s L:%d ", mem->file_name, mem->line); + } + + mem = (struct heap_mem *)&heap_ptr[mem->next]; + + count++; + rt_kprintf(" "); + } + rt_kprintf("mem_dump end "); + + rt_exit_critical(); +} +#ifdef RT_USING_FINSH +#include
+FINSH_FUNCTION_EXPORT_ALIAS(mem_dump, mem_dump, webclient multiple download test); +#endif /* RT_USING_FINSH */ + /** * @addtogroup MM */ @@ -243,7 +287,7 @@ void rt_system_heap_init(void *begin_addr, void *end_addr) * * @return pointer to allocated memory or NULL if no free memory was found. */ -void *rt_malloc(rt_size_t size) +void *rt_malloc_debug(rt_size_t size, const char * file, int line) { rt_size_t ptr, ptr2; struct heap_mem *mem, *mem2; @@ -363,6 +407,13 @@ void *rt_malloc(rt_size_t size) RT_OBJECT_HOOK_CALL(rt_malloc_hook, (((void *)((rt_uint8_t *)mem + SIZEOF_STRUCT_MEM)), size)); + //debug + mem->tick = rt_tick_get(); + strncpy(mem->thread_name, rt_thread_self()->name, RT_NAME_MAX); + strncpy(mem->file_name, file, sizeof(mem->file_name) - 1); + mem->file_name = '�'; + mem->line = line; + /* return the memory data except mem struct */ return (rt_uint8_t *)mem + SIZEOF_STRUCT_MEM; } @@ -372,7 +423,7 @@ void *rt_malloc(rt_size_t size) return RT_NULL; } -RTM_EXPORT(rt_malloc); +//RTM_EXPORT(rt_malloc); /** * This function will change the previously allocated memory block. ``` 然后把rtthread.h中的rt_malloc指向新rt_malloc_debug ```diff include/rtthread.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/rtthread.h b/include/rtthread.h index edd207b..94830a7 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -222,7 +222,8 @@ void rt_mp_free_sethook(void (*hook)(struct rt_mempool *mp, void *block)); */ void rt_system_heap_init(void *begin_addr, void *end_addr); -void *rt_malloc(rt_size_t nbytes); +void *rt_malloc_debug(rt_size_t size, const char * file, int line); +#define rt_malloc(size) rt_malloc_debug(size, __FILE__, __LINE__) void rt_free(void *ptr); void *rt_realloc(void *ptr, rt_size_t nbytes); void *rt_calloc(rt_size_t count, rt_size_t size); ``` 然后执行测试程序,让内存多泄露一些,并让时间久一点,然后mem_dump()就能很明显找出泄露者了。
5
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
aozima
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
文章
28
回答
4482
被采纳
381
关注TA
发私信
相关文章
1
AT设备驱动中隐藏的内存泄漏
2
重复调用指定函数导致内存泄漏。
3
sqlite软件包内存泄漏
4
at socket导致内存泄露问题
5
请教下各位大佬,rtt里面判断内存泄露可以使用什么工具
6
求助 RTT1.20 + Lwip1.41 刷helloWorld 网页出现内存泄露
7
内存泄露导致崩溃的问题
8
CMUX部分是否有内存泄漏?
9
paho mqtt和mymqtt的内存泄露问题
10
ec200x内存泄漏
推荐文章
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
6
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部