设为首页 加入收藏

TOP

Linux下用内存管理器的钩子函数跟踪内存泄漏(二)
2014-11-24 02:38:55 来源: 作者: 【 】 浏览:8
Tags:Linux 内存 管理 钩子 函数 跟踪 泄漏
};
int fd = fileno(g_memory_trace_fp);
int alloc = (int)g_memory_trace_cache[index][BACK_TRACE_DEPTH];
void* addr = g_memory_trace_cache[index][BACK_TRACE_DEPTH+1];
int size = (int)g_memory_trace_cache[index][BACK_TRACE_DEPTH+2];
void** backtrace_buffer = g_memory_trace_cache[index];


snprintf(buffer, sizeof(buffer), "%s %p %d ", alloc "alloc":"free", addr, size);
if(!alloc)
...{
write(fd, buffer, strlen(buffer));
return;
}

char** symbols = backtrace_symbols(backtrace_buffer, BACK_TRACE_DEPTH);
if(symbols != NULL)
...{
int i = 0;
offset = strlen(buffer);
for(i = 0; i < BACK_TRACE_DEPTH; i++)
...{
if(symbols[i] == NULL)
...{
break;
}
char* begin = strchr(symbols[i], '(');
if(begin != NULL)
...{
*begin = ' ';
char* end = strchr(begin, ')');
if(end != NULL)
...{
strcpy(end, " ");
}
strncpy(buffer+offset, begin, sizeof(buffer)-offset);
offset += strlen(begin);
}
}
write(fd, buffer, offset);
free(symbols);
}


return;
}


static void memory_trace_flush(void)
...{
int i = 0;
for(i = 0; i < g_memory_trace_cache_used; i++)
...{
memory_trace_flush_one_entry(i);
}
g_memory_trace_cache_used = 0;


return;
}


static void memory_trace_write(int alloc, void* addr, int size)
...{
if(g_memory_trace_cache_used >= CACHE_SIZE)
...{
memory_trace_flush();
}


int i = 0;
void* backtrace_buffer[BACK_TRACE_DEPTH] = ...{0};
backtrace(backtrace_buffer, BACK_TRACE_DEPTH);


for(i = 0; i < BACK_TRACE_DEPTH; i++)
...{
g_memory_trace_cache[g_memory_trace_cache_used][i] = backtrace_buffer[i];
}
g_memory_trace_cache[g_memory_trace_cache_used][BACK_TRACE_DEPTH] = (void*)alloc;
g_memory_trace_cache[g_memory_trace_cache_used][BACK_TRACE_DEPTH+1] = addr;
g_memory_trace_cache[g_memory_trace_cache_used][BACK_TRACE_DEPTH+2] = (void*)size;


g_memory_trace_cache_used++;


return;
}


#ifdef MEMORY_TRACE_TEST
void test(void)
...{
char* p = malloc(100);
p = malloc(123);


free(p);


return;
}
int main(int argc, char* argv[])
...{
malloc(100);
test();
malloc(100);
test();
char* p = malloc(100);
free(p);

return 0;
}
#endif/*MEMORY_TRACE_TEST*/


把以上代码编译成动态库,或者直接编译到功能代码一起。如果设置了MALLOC_TRACE环境变量,分配/释放会被记录到/tmp/$PID_memory.log下。


再写个程序来分析log文件:
/**//*mtrace.c*/
#include


#define MAX_ENTRY 1024*1024


int main(int argc, char* argv[])
...{
if(argc != 3)
...{
printf("usage: %s [log file] [out file] ", argv[0]);
return 0;
}


FILE* fp = fopen(argv[1], "r");
FILE* fp_out = fopen(argv[2], "wb+");


if(fp == NULL || fp_out == NULL)
...{
printf("open file failed ");
if(fp != NULL)
...{
fclose(fp);
}
if(fp_out != NULL)
...{
fclose(fp_out);
}
return;
}


int i = 0;
int n = 0;
int skip = 0;
int line_index = 0;
void* addr = 0;
char line[260] = ...{0};
void* addrs_array[MAX_ENTRY] = ...{0};
int lines_array[MAX_ENTRY] = ...{0};



while(fgets(line, sizeof(line), fp) != NULL)
...{
if(line[0] != 'a' && line[0] != 'f')
...{

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux Shell 下的输出重定向 下一篇C++中友元的一些总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: