一種定位記憶體洩露的方法(Linux)

2021-05-22 13:28:46 字數 2335 閱讀 1332

本文是《一種定位記憶體洩露的方法(

solaris

)》對應的

linux

版本,偵錯程式使用

gdb。主要介紹例項部分。其他請見《一種定位記憶體洩露的方法(

solaris

)》。模擬

new失敗的程式:

#include

class abc

int i;

int j; };

void f()

throw std::bad_alloc(); }

int main()

1)編譯執行此段**。產生乙個

core

檔案2)

用gdb

開啟這個

core

檔案:gdb a.out core

(gdb)run

starting program: /test/new_fail/a.out

terminate called after throwing an instance of 'std::bad_alloc'

what():std::bad_alloc

program received signal sigabrt, aborted.

0x00007ffff733f645 in raise () from /lib64/libc.so.6

(gdb)info proc

process 10683

cmdline = '/test/new_fail/a.out'

cwd = '/test/new_fail'

exe = '/test/new_fail/a.out'

(gdb) shell pmap 10683

10683: a.out

00000000004000004k4k4k0k0k r-xp /test/new_fail/a.out

00000000006000004k4k4k4k0k r--p /test/new_fail/a.out

00000000006010004k4k4k4k0k rw-p /test/new_fail/a.out

0000000000602000132k32k32k32k0k rw-p [heap] …

(略)total:11468k1048k684k180k0k

360k writable-private, 11108k readonly-private, 0k shared, and 1048k referenced

可以看到

heap

空間的起始位址是

0x0000000000602000

,共132k

位元組,即

132*1024=135168

位元組。3)

因為是64

位應用程式,所以指標佔

8位元組。所以需要遍歷的指標個數為

135168/8=16896。4)

將結果輸出到日誌檔案

gdb.txt

中:(gdb) set height 0

(gdb) set logging on

copying output to gdb.txt.

(gdb) x/16896a 0x0000000000602000

gdb.txt

的內容:

0x602000:0x00x21

0x602010:0x400b30 <_ztv3abc+16>0x0

0x602020:0x00x21

0x602030:0x400b30 <_ztv3abc+16>0x0 ….

5)過濾gdb.txt

:awk '' gdb.txt|c++filt|grep vtable>gdb_vtable.txt

gdb_vtable.txt

的內容為:

…. 6)將

gdb_vtable.txt

的內容匯入到

sqlserver

中(如果記錄不多,可以用

excel

代替)。表名為

gdb_vtable

,第一列

col001

為符號。對其分組求和:

select col001, count(1) quantity from gdb_vtable

group by col001

order by quantity desc

結果為:

col001

quantity

1000 1

可知core

裡有1000

個abc

,遍歷使用

abc的**,可知存在洩漏。

一種定位記憶體洩露的簡易方法

在這篇文章中,將介紹一種定位記憶體洩露的方法。主要原理是通過記憶體洩露時分配的序號以及大小,配合dbgheap.c檔案來定位。在vs開發過程中,開啟crt內部的記憶體洩露檢測函式,當程式退出時,在除錯視窗會輸出未釋放的記憶體資訊,例如下圖所示 從上面截圖可以得知,該次記憶體分配序號為1789698,...

Linux使用者程序記憶體洩露一種檢測方法

在 linux 中,使用者程序在 proc status 檔案中記錄了該程序的記憶體使用實時情況。vmsize 虛擬記憶體大小。整個程序使用虛擬記憶體大小,是 vmlib,vmexe,vmdata,和 vmstk 的總和。vmlck 虛擬記憶體鎖。程序當前使用的並且加鎖的虛擬記憶體總數 vmrss ...

VC 記憶體洩露與檢測的一種方法

本文介紹,當vc 或者mfc程式,出現記憶體洩露時,如何快速定位的方法,這種方法有一定的侷限性,在注意事項中會給出的。當mfc程式出現記憶體洩露時,退出程式時的vs除錯輸出視窗,一般會有如下顯示 上面顯示了在程式的哪個檔案的哪行語句,發生了記憶體洩露,其中 表示 記憶體分配編號 normal blo...