wow-mem-leak文件说明
- 项目地址:https://gitee.com/wow-iot/wow-iot7
- 本文件的的功能主要用于查找程序使用过程中是否存在内存泄漏的问题;
- 实现原理:释放和申请都通过重定义的接口进入,所有的申请内容都通过结构体的方式进行存储,并通过链表的方式进行关联;当释放时则将此结构体内容从链表中移除;在程序退出时打印链表信息,来判断是否存在内存未释放,并将其信息打印;
实现架构
typedef struct BlockInfo{
void* ptr; /* 存储块的开始位置 */
size_t size; /* 存储块的长度 */
int fReferenced; /* 曾经引用过吗? */
const char* fileName; /*引用文件名称*/
const char* funcName; /*引用函数名称*/
int line; /*引用行标识*/
struct BlockInfo* next;
}__data_aligned__ BlockInfo_T;
/*brief malloc内部调试接口
*param : snSize:分配缓存大小
*param : snLine:行信息
*param : pcFile:文件信息
*param : pcFunc:文件信息
*return: 成功返回申请缓存 失败返回NULL
*/
void* wow_mleak_malloc(size_t snSize, size_t snLine, const char* pcFile, const char* pcFunc)
{
void* ptr = malloc(snSize);
CHECK_RET_VAL(ptr,NULL);
memset(ptr,MALLOC_GARBAGE,snSize);
/* 如果无法创建日志块信息,那么模拟一个总的内存分配错误*/
if(create_block_info(ptr, snSize, snLine, pcFile, pcFunc) != 0){
free(ptr);
ptr = NULL;
}
return ptr;
}
/*brief free内部调试接口
*param : pBuff:缓存
*return: 无
*/
void wow_mleak_free(void* ptr)
{
CHECK_RET_VOID(ptr);
ssize_t size = get_block_size(ptr);
CHECK_RET_VOID(size > 0);
free_block_info(ptr);
memset(ptr, MALLOC_GARBAGE,size );
free(ptr);
}
/*brief 打印内存泄漏信息
*return: 无
*/
void wow_mleak_print(void)
{
size_t sum = 0;
int nbBlocks = 0;
BlockInfo_T* tmp = NULL;
wow_mutex_lock(>_mutexLock);
BlockInfo_T* block = gpt_blockHeadInfo ;
if (block != NULL){
printf("Memory Leaks detected.\n");
}
while(block != NULL){
printf("wow_print_leaks block:%p\n",block);
tmp = block->next;
printf("\n%zu bytes lost\n", block->size);
printf("address : %p in %s\t%s:%d\n", block->ptr, block->funcName, block->fileName, block->line);
printf("\n====================================\n");
sum += block->size;
free(block);
block = tmp;
nbBlocks++;
}
printf("SUMMARY :\n%zu bytes lost in %d blocks\n", sum, nbBlocks);
wow_mutex_unlock(>_mutexLock);
}