Linux內存調試工具初探-MEMWATCH
C 語言作為 Linux 系統上標準的編程語言給予了我們對動態內存分配很大的控制權。這種自由可能會導致嚴重的內存管理問題,可能導致程序崩潰或隨時間的推移導致性能降級。
內存泄漏(即 malloc()
內存在對應的 free()
調用執行后永不被釋放)和緩沖區溢出(例如對以前分配到某數組的內存進行寫操作)是一些常見的問題,它們可能很難檢測到。這一部分將討論幾個調試工具,它們極大地簡化了檢測和找出內存問題的過程
1. Memwatch簡介
Memwatch是C語言的內存檢測器。除了檢測內存的功能外,它同樣可以做其它的一些事情,而我們主要還是在于講述它的基本功能。如果你真的想要知道所有相關的具體細節,可詳細查看頭文件memwatch.h以及源代碼。
它使用C于處理器的功能,Memwatch使用它自己定義的功能函數取代所有在你的程序中用ANSI C定義的內存分配函數,Memwatch的內存分配函數包含了了所有的分配記錄信息。
Memwatch可以在交叉編譯后的目標板上運行。
2. Memwatch功能
(1) 主要有基本的內存管理函數
-mwMalloc()
-mwFree()
-mwCalloc()
-mwRealloc()
(2) MemWatch能夠檢測的功能包括
-雙重釋放(double-free)、
-錯誤釋放(erroneous free)、
-內存泄漏(unfreed memory)、
-溢出(Overflow)、
-下溢(Underflow)
3. 編譯
當編譯時, 相讓memwatch起作用, 編譯是加上-DMEMWATCH
4. memwatch.log內容
在正常操作的情況下,memwatch會創建一個名叫memwatch.log的文件。但有的時候,memwatch.log文件并不能被創建。此時,memwatch會嘗試創建命名類似memwatNN.log的文件,其中NN是01到99之間的數字。如果還是失敗,則沒有log文件。
5. 應用實例
#include <stdlib.h>
#include <stdio.h>
#include "memwatch.h"
int main(void)
{
char *ptr1;
char *ptr2;
ptr1 = malloc(512);
ptr2 = malloc(512);
ptr2 = ptr1;
free(ptr2);
free(ptr1);
}
清單 1 中的代碼將分配兩個 512 字節的內存塊,然后指向第一個內存塊的指針被設定為指向第二個內存塊。結果,第二個內存塊的地址丟失,從而產生了內存泄漏。
現在我們編譯清單 1 的 memwatch.c。下面是一個 makefile 示例:
gcc -DMEMWATCH -DMW_STDIO test1.c memwatch
c -o test1
當您運行 test1 程序后,它會生成一個關于泄漏的內存的報告。清單 2 展示了示例 memwatch.log 輸出文件。
MEMWATCH 2.67 Copyright (C) 1992-1999 Johan Lindh
...
double-free: <4> test1.c(15), 0x80517b4 was freed from test1.c(14)
...
unfreed: <2> test1.c(11), 512 bytes at 0x80519e4
{FE FE FE FE FE FE FE FE FE FE FE FE ..............}
Memory usage statistics (global):
N)umber of allocations made: 2
L)argest memory usage : 1024
T)otal of all alloc() calls: 1024
U)nfreed bytes totals : 512
MEMWATCH 為您顯示真正導致問題的行。如果您釋放一個已經釋放過的指針,它會告訴您。對于沒有釋放的內存也一樣。日志結尾部分顯示統計信息,包括泄漏了多少內存,使用了多少內存,以及總共分配了多少內存。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成