资源简介

功能说明: 检查堆内存的问题,定位到文件,行数 1. 踩内存 2. 内存重复释放 3. 内存泄露 使用方法用 dbg_malloc, dbg_free 替换原程序中的malloc, free. 适当的时候调用dbg_memory_check 以检查内存泄露。 原理: 在申请的内存前后添加 隔离带,并做记录。在free, dbg_memory_check中检查踩内存。在free中检查重复释放。 假设要申请的为 size ,则实际申请的为 size + gap_size (前后隔离带的大小) GAP_BEGIN | size | GAP_END PS: 此文件可酌情修改,以适应不同的设备,平台等。 多线程情况下,请对dbg_malloc_ dbg_free_ dbg_memory_check 加锁

资源截图

代码片段和文件信息

/*
功能说明:
   检查堆内存的问题,定位到文件,行数
   1. 踩内存
   2. 内存重复释放
   3. 内存泄露
   
   使用方法用 dbg_malloc, dbg_free 替换原程序中的malloc free.
   适当的时候调用dbg_memory_check 以检查内存泄露。
   
原理:
   在申请的内存前后添加 隔离带,并做记录。在free dbg_memory_check中检查踩内存。在free中检查重复释放。
   假设要申请的为 size ,则实际申请的为  size + gap_size (前后隔离带的大小)  
   GAP_BEGIN | size | GAP_END 

PS:
   此文件可酌情修改,以适应不同的设备,平台等。
   多线程情况下,请对dbg_malloc_  dbg_free_  dbg_memory_check 加锁   
*/


#include “stdio.h“
#include “stdlib.h“
#include “string.h“

#define MEM_NODE_MAX (100)

#define MEM_GAP_LEN                 (100)
#define MEM_GAP_BEFORE              “MEM_GAP_BEFORE__GAP01234567899876543210012345678998765432100123456789987654321001234567899876543210“                 // 99
#define MEM_GAP_END                 “01234567899876543210012345678998765432100123456789987654321001234567899876543210MEM_GAP_ENDEND__GAP“   // 99

// #define MEM_GAP_LEN                 (10)
// #define MEM_GAP_BEFORE “123456789“
// #define MEM_GAP_END “987654321“
#define FILE_PATH_LEN_MAX           (1024)

#define dbg_malloc(size)   dbg_malloc_(size __FILE__ __LINE__) 
#define dbg_free(p)        dbg_free_(p __FILE__ __LINE__)


#define MEMORY_DEBUG_ERROR_NODES_FULL  (1)
#define MEMORY_DEBUG_ERROR_NO_MEMORY  (2)
#define MEMORY_DEBUG_ERROR_GAP_BEFORE  (3)
#define MEMORY_DEBUG_ERROR_GAP_END  (4)
#define MEMORY_DEBUG_ERROR_FREE  (5)


typedef struct memory_node_{
void* op;
int osize;
void* cp;
char filepath[FILE_PATH_LEN_MAX];
int line;
} memory_node;

memory_node memory_debug_nodes[MEM_NODE_MAX] = {0};

void print_block(char s[] char* buf int len) {
printf(“%s\n“ s);

int i = 0;
for (i = 0; i < len; i++) {
printf(“0x%02hhX“ *(buf + i));

}
printf(“\n“);
}


void memory_error_handle(int type){
printf(“memory_error_handle error:%d\n“ type);
}

void *dbg_malloc_(unsigned int size char* filepath int line){
void* op = malloc(size + 2 * MEM_GAP_LEN);
if (op == NULL){
printf(“MEMMORY_DEBUG_INFO: MALLOC FAIL\n“);
memory_error_handle(MEMORY_DEBUG_ERROR_NO_MEMORY);
return NULL;
}
void* cp = (op + MEM_GAP_LEN);

int i = 0;
int finded = 0;
for (i = 0; i < MEM_NODE_MAX; i++){
if (memory_debug_nodes[i].op == NULL){
finded = 1;
memory_debug_nodes[i].op = op;
memory_debug_nodes[i].cp = cp;
memory_debug_nodes[i].line = line;
memory_debug_nodes[i].osize = size;
strcpy((char*)memory_debug_nodes[i].filepath filepath);

// fill gaps
strcpy((char*)op MEM_GAP_BEFORE);
strcpy((char*)(op + MEM_GAP_LEN + size) MEM_GAP_END);
break;
}
}

if (0 == finded){
printf(“MEMMORY_DEBUG_INFO: memory_debug_nodes full no space to save\n“);
memory_error_handle(MEMORY_DEBUG_ERROR_NODES_FULL);
}

return cp;
}

void dbg_memory_check(){
int i = 0;
int cnt_nfree = 0;
printf(“MEMMORY_DEBUG_INFO: MEMORY CHECK BEGIN=======================================\n“);

for (i = 0; i < MEM_NODE_M

评论

共有 条评论