mtrace
#include
#include
int main()
加上標頭檔案
#include
然後在main()函式的開頭加上
mtrace();
在main函式返回前加上
muntrace();
malloc_trace=/home/stevewong
/mtrace/mt.log
export malloc_trace
gcc mt.c -g mt.o
./mt.o
mtrace mt.o mt.log
可以看到:
memory not freed:
-----------------
address size caller
0x0000000000d65460 0x4 at /home/stevewong/mtrace/mt.c:7
#include
#include
int main()
no memory leaks.
#include
#include
#include
using
namespace
std;
int main()
memory not freed:
-----------------
address size caller
0x000000000125d460 0x28 at 0x7fb584cc82e8
0x28就是40個位元組,正好對應10個int。
再來看乙個類的例子
include #include
#include
#include
using
namespace
std;
class c
~c()
};int main()
輸出:
new
0x1eb9468
new0x1eb9469
new0x1eb946a
new0x1eb946b
new0x1eb946c
new0x1eb946d
new0x1eb946e
new0x1eb946f
new0x1eb9470
new0x1eb9471
addr of pc: 0x1eb9468
size of pc: 8
size of
class c: 1, 1
記憶體洩露檢測
memory not freed:
-----------------
address size caller
0x0000000001eb9460 0x12 at 0x7fefd2c802e8
乙個只有建構函式和析構函式的類佔1個位元組(建構函式和析構函式不佔空間),10個空類10個位元組,但是記憶體洩露檢測顯示size是0x12也就是18個位元組,多出來的8個位元組是?
使用gdb檢視記憶體可以發現
display *((int*)0x1eb9460)
結果是10。說明這8個位元組是存了陣列的長度。可以參考以下文章:
c++物件模型之簡述c++物件的記憶體布局
如果只是delete了pc,沒有delete整個物件陣列呢?
#include
#include
#include
#include
using
namespace
std;
class c
~c()
};int main()
只呼叫了乙個析構函式,然後就出錯了。
new
0x13d3468
new0x13d3469
new0x13d346a
new0x13d346b
new0x13d346c
new0x13d346d
new0x13d346e
new0x13d346f
new0x13d3470
new0x13d3471
addr of pc: 0x13d3468
size of pc: 8
size of
class c: 1, 1
delete 0x13d3468
*** error
in `./new
': munmap_chunk(): invalid pointer: 0x00000000013d3468 ***
aborted
檢視記憶體洩露檔案mt.log
- 0x00000000013d3468 free 3 was never alloc'd /home/stevewong/mtrace/new.c:29
memory not freed:
-----------------
address size caller
0x00000000013d3460 0x12 at 0x7f0ab50e52e8
洩露的長度是0x12=18,也就說所有的記憶體都沒被釋放。
這裡有個有趣的問題,如果把陣列長度設定為4的話,並沒有記憶體洩露,而是出現了segmentation fault。求高手指教一下這是為什麼。對應的輸出是
new
0x1f7a468
new0x1f7a469
new0x1f7a46a
new0x1f7a46b
addr of pc: 0x1f7a468
size of pc: 8
size of
class c: 1, 1
delete 0x1f7a468
segmentation fault
對應的記憶體洩露檔案是
no memory leaks.
#include
#include
#include
#include
using
namespace
std;
class c
~c()
};int main()
輸出:
new
0x108c468
new0x108c469
new0x108c46a
new0x108c46b
new0x108c46c
new0x108c46d
new0x108c46e
new0x108c46f
new0x108c470
new0x108c471
delete
0x108c471
delete
0x108c470
delete
0x108c46f
delete
0x108c46e
delete
0x108c46d
delete
0x108c46c
delete
0x108c46b
delete
0x108c46a
delete
0x108c469
delete
0x108c468
記憶體洩露檢視:no memory leaks.
Linux C 程式設計記憶體洩露檢測工具 mtrace
所有使用動態記憶體分配 dynamic memory allocation 的程式都有機會遇上記憶體洩露 memory leakage 問題,在linux裡有三種常用工具來檢測記憶體洩露的情況,包括 mtrace dmalloc memwatch mtrace是三款工具之中是最簡單易用的,mtrac...
Linux 記憶體洩露檢測
1.需要在記憶體洩露開始的開始呼叫void mtrace void mtrace 為malloc等函式安裝 hook,用於記錄記憶體分配資訊,在需要記憶體洩露檢查 結束的地方呼叫void muntrace void 注意 在一般情況下,不要呼叫muntrace 而讓程式自然結束。因為可能有些記憶體釋...
linux檢測記憶體洩露
關於記憶體洩露 客戶的一台ap server,記憶體使用量一直很大,swap使用量從三月份開始在慢慢增多。懷疑與記憶體洩露有關,查詢了一些資料,發現對於linux真個系統的記憶體洩露檢測工具很少。有如下幾個,但是都只針對單個程式。如果測試真個記憶體的情況,特別是歷史記錄,不知道還有沒有好的工具。va...