wow-mem-leak文件说明

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(&gt_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(&gt_mutexLock);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值