偶然在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