偶然在ChinaUnix上看到一篇关于程序调试的帖子,里面讨论到了很多调试程序的方法,其中一个方法如下,觉得还不错:
如果别人的程序里malloc很多,不知道哪里有内存越界,
那就把malloc, free重新定义掉,放在一个头文件里,如mem.h
用gcc -include mem.h的方式重新编译代码,可以不修改别人的代码来检查内存问题。
(类似的,还要重定义strdup, realloc等函数)
代码如下:
#define MAGIC_NUM 0x11121314
/*
MAGIC_NUM 随机的定一个整数,作为原始内存分配时的附加标志,因此,这个数字尽量设定出现概率小的值,不要用0x00000000这个样出现概率很大的值,用来减少此方法出错的概率,也就是说该方法在很小的概率下还是会有错误的。
*/
static void *my_malloc (size_t size)
{
int magic = (int) MAGIC_NUM;
char *p = malloc (size + sizeof (size) + sizeof (magic));
memcpy (&p[0], &size, sizeof (size_t));
memcpy (&p[size - sizeof (magic) ], magic, sizeof (magic));
return (void *) (p + sizeof (size));
}
#undef malloc
#define malloc my_malloc
static void *my_free (void *ptr)
{
size_t size;
int magic;
char *p = (char *) ptr - sizeof (size);
memcpy (&size, p, sizeof (size));
memcpy (&magic, &p[size + sizeof (size)], sizeof (magic));
if (magic != (int) MAGIC_NUM)
{
fprintf (stderr, "Memory overflow!n")
fflush (stderr);
while (1);
}
free (p);
}
#undef free
#define free my_free
/*
MAGIC_NUM 随机的定一个整数,作为原始内存分配时的附加标志,因此,这个数字尽量设定出现概率小的值,不要用0x00000000这个样出现概率很大的值,用来减少此方法出错的概率,也就是说该方法在很小的概率下还是会有错误的。
*/
static void *my_malloc (size_t size)
{
int magic = (int) MAGIC_NUM;
char *p = malloc (size + sizeof (size) + sizeof (magic));
memcpy (&p[0], &size, sizeof (size_t));
memcpy (&p[size - sizeof (magic) ], magic, sizeof (magic));
return (void *) (p + sizeof (size));
}
#undef malloc
#define malloc my_malloc
static void *my_free (void *ptr)
{
size_t size;
int magic;
char *p = (char *) ptr - sizeof (size);
memcpy (&size, p, sizeof (size));
memcpy (&magic, &p[size + sizeof (size)], sizeof (magic));
if (magic != (int) MAGIC_NUM)
{
fprintf (stderr, "Memory overflow!n")
fflush (stderr);
while (1);
}
free (p);
}
#undef free
#define free my_free