1. 程式人生 > >Linux C 程式設計記憶體洩露檢測工具(二):memwatch

Linux C 程式設計記憶體洩露檢測工具(二):memwatch

Memwatch簡介

在三種檢測工具當中,設定最簡單的算是memwatch,和dmalloc一樣,它能檢測未釋放的記憶體、同一段記憶體被釋放多次、位址存取錯誤及不當使用未分配之記憶體區域。請往http://www.linkdata.se/sourcecode.html下載最新版本的Memwatch。

安裝及使用memwatch

很幸運地,memwatch根本是不需要安裝的,因為它只是一組C程式程式碼,只要在你程式中加入memwatch.h,編譯時加上-DMEMWATCH -DMW_STDIO及memwatch.c就能使用memwatch,例如:

gcc -DMEMWATCH -DMW_STDIO test.c memwatch.c -o test

memwatch輸出結果

memwatch的輸出檔名稱為memwatch.log,而且在程式執行期間,所有錯誤提示都會顯示在stdout上,如果memwatch未能寫入以上檔案,它會嘗試寫入memwatchNN.log,而NN介於01至99之間,若它仍未能寫入memwatchNN.log,則會放棄寫入檔案。

我們引用第一篇(mtrace)中所使用過的有問題的程式碼:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <memwatch.h>
    int main() {
        char *hello;

        setenv("MALLOC_TRACE", "output", 1);
        mtrace();
        if ((hello = (char *) malloc(sizeof(char))) == NULL) {
            perror("Cannot allocate memory.");
            return -1;
        }

        return 0;
    }

然後在shell中輸入以下編譯指令:

    gcc -DMEMWATCH -DMW_STDIO test.c memwatch.c -o test

memwatch.log的內容如下:

    ============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============

    Started at Sat Jun 26 22:48:47 2004

    Modes: __STDC__ 32-bit mwDWORD==(unsigned long)
    mwROUNDALLOC==4 sizeof(mwData)==32 mwDataSize==32


    Stopped at Sat Jun 26 22:48:47 2004

        unfreed: <1> test.c(9), 1 bytes at 0x805108c    {FE .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .}

    Memory usage statistics (global):
     N)umber of allocations made: 1
     L)argest memory usage      : 1
     T)otal of all alloc() calls: 1
     U)nfreed bytes totals      : 1

檔案指出,在test.c被執行到第9行時所分配的記憶體仍未被釋放,該段記憶體的大小為1 byte。

Memwatch使用注意

Memwatch的優點是無需特別配置,不需安裝便能使用,但缺點是它會拖慢程式的執行速度,尤其是釋放記憶體時它會作大量檢查。但它比mtrace和dmalloc多了 一項功能,就是能模擬系統記憶體不足的情況,使用者只需用mwLimit(long num_of_byte)函式來限制程式的heap memory大小(以byte單位)。

最詳細的使用說明(包括優點缺點,執行原理等)已在README中列出,本人強烈建議各位讀者參考該檔案。