本文是《一種定位記憶體洩露的方法(
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...