一種C程式記憶體越界調試方法

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.