内存检查工具CheckMemory实现思路

来源:百度文库 编辑:神马文学网 时间:2024/10/03 03:40:24
检查的使用也主要是对这些函数及其使用的内存指针的追踪
void * checkmem_malloc(size_t n, const char *fn, int line);
void  checkmem_free(void* ptr, const char *fn, int line);
void * checkmem_realloc(void *ptr, size_t n, const char *fn, int line);
跟踪就需要用到hash,由一个hash表来维护追踪内存的变化情况。
当要查询时,打印hash表中需要的值。
比如
void *
checkmem_malloc(size_t n, const char *fn, int line)
{
void *ptr = NULL;
if ((n <= 0) || (fn == NULL) || (line <= 0)) {
printf("%s %d %s %d %ld\n\n", __func__, __LINE__,fn, line, n);
sleep(10);
}
if (checkmem_log == NULL) {
checkmem_log = checkmem_init();
if (checkmem_log == NULL) {
printf("%s %d fail to init checkmem_log handler\n\n", __func__, __LINE__);
return NULL;
}
}
ptr = ((void*)malloc(n));
if (ptr == NULL) {
printf("%s %d malloc error 0x%x\n\n", __func__, __LINE__,errno);
sleep(10);
} else {
checkmem_hash_add(checkmem_log, ptr, n, fn, line);
}
return ptr;
}
当需要检查内存使用情况通过命令将其打印出来。
在打印出的所有没有被释放的内存中,有些是属于正常的,即程序一启动就会被分配,且一直不被释放;另外还有一些内存是不断增加而不被释放的,对于这些内存就需要引起特别重视,它们很可能就是产生内存泄露的地方。通过这一工具检查,正常状况应该是经过一段时间的运行之后,内存就保持到一个比较稳定的状态,不再增加或减少。