標籤:des style http io 使用 ar 檔案 sp div
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中列出,本人強烈建議各位讀者參考該檔案。
相關連結:
- Memwatch下載
Linux C 編程記憶體泄露檢測工具(二):memwatch