linux 記憶體洩露檢測 mtrace

2021-07-16 13:46:09 字數 4170 閱讀 4168

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...