Linux C記憶體洩露檢測工具

2021-07-04 09:01:02 字數 4047 閱讀 8498

**:

在linux下些c語言程式,最大的問題就是沒有乙個好的程式設計ide,當然想kdevelop等工具都相當的強大,但我還是習慣使用kdevelop工具,由於沒有乙個習慣的程式設計ide,記憶體檢測也就成了在linux下編寫程式的乙個大問題。

是不是說沒有一種記憶體檢查工具能夠在linux使用呢,也不是,像

在編譯你的程式時,請設定-g引數,編譯出後使用如下的命令來判斷你的程式存在記憶體洩露:

valgrind --tool=memcheck --leak-check=full  yourprog(例如./a.out)在輸出資訊中就會看到你的記憶體問題了。關於這些引數是什麼意思可以參考valgrind --help 的輸出資訊。

linux c 程式設計記憶體洩露檢測工具(一):mtrace 前言

所有使用動態記憶體分配(dynamic memory allocation)的程式都有機會遇上記憶體洩露(memory leakage)問題,在linux裡有三種常用工具來檢測記憶體洩露的情況,包括:

1. mtrace

2. dmalloc

3. memwatch

1. mtrace

mtrace是三款工具之中是最簡單易用的,mtrace是乙個c函式,在裡宣告及定義,函式原型為:

void mtrace(void);

其實mtrace是類似malloc_hook的 malloc handler,只不過mtrace的handler function已由系統為你寫好,但既然如此,系統又怎麼知道你想將malloc/free的記錄寫在**呢?為此,呼叫mtrace()前要先設定 malloc_trace環境變數:

#include

....

setenv("malloc_trace", "output_file_name", 1);

...

「output_file_name」就是儲存檢測結果的檔案的名稱。

但是檢測結果的格式是一般人無法理解的,而只要有安裝mtrace的話,就會有一名為mtrace的perl script,在shell輸入以下指令:

mtrace [binary] output_file_name

就會將output_file_name的內容轉化成能被理解的語句,例如「no memory leaks」,「0x12345678 free 10 was never alloc」諸如此類。

例如以下有一函式:(暫且放下single entry single exit的原則)

#include

#include

#include

#include

int main() 

return 0; }

執行後,再用mtrace 將結果輸出:

- 0x08049670 free 3 was never alloc'd 0x42029acc

- 0x080496f0 free 4 was never alloc'd 0x420dc9e9

- 0x08049708 free 5 was never alloc'd 0x420dc9f1

- 0x08049628 free 6 was never alloc'd 0x42113a22

- 0x08049640 free 7 was never alloc'd 0x42113a52

- 0x08049658 free 8 was never alloc'd 0x42113a96

memory not freed:

-----------------

address 

size 

caller

0x08049a90 

0x1 

at 0x80483fe

最後一行標明有乙個大小為1 byte的記憶體尚未釋放,大概是指「hello」吧。

若我們把該段記憶體釋放:

#include

#include

#include

#include

int main() 

free(hello);

return 0; }

結果如下:

- 0x080496b0 free 4 was never alloc'd 0x42029acc

- 0x08049730 free 5 was never alloc'd 0x420dc9e9

- 0x08049748 free 6 was never alloc'd 0x420dc9f1

- 0x08049668 free 7 was never alloc'd 0x42113a22

- 0x08049680 free 8 was never alloc'd 0x42113a52

- 0x08049698 free 9 was never alloc'd 0x42113a96

no memory leaks.

mtrace的原理是記錄每一對malloc-free的執行,若每乙個malloc都有相應的free,則代表沒有記憶體洩露,對於任何非malloc/free情況下所發生的記憶體洩露問題,mtrace並不能找出來。

memwatch簡介

在三種檢測工具當中,設定最簡單的算是memwatch,和dmalloc一樣,它能檢測未釋放的記憶體、同一段記憶體被釋放多次、位址訪問錯誤及不當使用未分配之記憶體區域。請前往

安裝及使用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

#include

#include

#include

int main() 

return 0;}

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

gcc -dmemwatch -dmw_stdio test.c memwatch.c -o test

memwatch.log的內容如下:

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 

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中列出,本人強烈建議各位讀者參考該檔案。

Linux C 程式設計記憶體洩露檢測工具 mtrace

所有使用動態記憶體分配 dynamic memory allocation 的程式都有機會遇上記憶體洩露 memory leakage 問題,在linux裡有三種常用工具來檢測記憶體洩露的情況,包括 mtrace dmalloc memwatch mtrace是三款工具之中是最簡單易用的,mtrac...

記憶體洩露檢測工具 valgrind

valgrind 安裝 2.解壓安裝包 tar jxvf valgrind 3.2.3.tar.bz2 3.解壓後生成目錄valgrind 3.2.3 4.cd valgrind 3.2.3 5.執行.autogen.sh設定環境 需要標準的autoconf工具 可選 6.configure 配置v...

valgrind記憶體洩露檢測工具

一 安裝 valgrind linux環境首先進入root使用者 然後執行下面的命令 tar jxvf valgrind 3.12.0.tar.bz2 cd valgrind 3.12.0 configure make make install valgrind version 檢視valgrind...