资源简介
功能说明:
检查堆内存的问题,定位到文件,行数
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
相关资源
- 内存自BUFF单元开始的存储区连续存放
- qt写的共享内存简单
- 内存注入(IAT Hook 和Inline Hook)
- Linux内存分配与回收
- Linux基于Live555从共享内存 获取rstp实时
- 池内春秋-候杰
- 内存遍历工具源码
- DELPHI 内存映射共享内存
- 内存特征码定位器DDHSerach1.0.7z
- 从资源或内存中加载dll
- 操作系统 内存管理课程设计报告
- 进程cpu占用率和内存使用大小获取
- 求破_内存_模块V1.0 .ec
- 龙龙内存遍历工具
- VC GDI+ 窗口截图内存BMP转JPG压缩、JP
- 操作系统实验,进程调度,作业调度
- 内存卡低格工具汉化版
- 将两个多位十进制数相加,要求加数
- TLSF开源算法
- vld1.0内存泄漏检测
- 易语言动态调用DLL含内存DLL调用
- sharememory.tar.gz
- 基于IntervalZero RTX 环境下的进程间通讯
- 奇迹MU内存辅助源码
- VT过游戏保护,调试有保护的游戏
- ifive_mini3视网膜版本_miui小米系统内存
- 基于Live555的从多个摄像头实时获取
- 进程调度与内存管理:这是我花了很
- 动态内存分配算法实验报告
- linux内存管理实验报告
评论
共有 条评论