Linux C 程式設計記憶體洩露檢測工具(二):memwatch
阿新 • • 發佈:2019-01-24
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 testmemwatch輸出結果
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中輸入以下編譯指令:
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中列出,本人強烈建議各位讀者參考該檔案。