如何在Solaris上检测内存泄露

来源:互联网 发布:mac的右键不能用了 编辑:程序博客网 时间:2024/05/22 07:44

http://blog.csdn.net/hotsolaris/archive/2008/03/10/2163306.aspx

众所周知,mdb和dtrace是Solaris上的两把利剑。mdb不仅可以事实观察内核中事实的运行状态,也可以对应用程序进行调试。坚持内存泄露可能对大部分开发人员都是一件头疼的事情,借助mdb的帮助,可以很方便的检查出程序的内存泄露。_5N UfC&i {H
uon,Px|8B_ek
在介绍之前,先介绍一下libmum,libmum是一个对内存进行检测的库,如果想使用mdb检查内存泄露,在程序运行时需要加载libmum库。-W+WX_u.rU#q

&laO:S:{`p export UMEM_DEBUG=default
h#@ A&}!|)E8h"mq export UMEM_LOGGING=transaction,yOTb%s/g:D
export LD_PRELOAD=libumem.so.1
'^LCbWK*p*D*f m)H2V;b nrnYk4U
下面这个程序有明星的内存泄露。申请的内存没有被释放掉。
l$Rc*I!^0V 使用ps -ef 找到运行程序的pid,使用gcore生成一个core文件,利用mdb打开core文件
-G T$d x^ bash-3.2# mdb core.237*S2^2E*w|d)@
Loading modules: [ libumem.so.1 ld.so.1 ]4u.i5{TC%Vw
> ::findleaks
2B4y~9@,g0m CACHE     LEAKED   BUFCTL CALLER#d*uz4k:Z5@/xphb5a
0806a290       1 0807f200 libstdc++.so.6.0.3`_Znwj+0x29x&`wvXcRGF(y
0806a290      60 0807f2f0 libstdc++.so.6.0.3`_Znwj+0x29
R {*j n%v3MH9n ------------------------------------------------------------------------7M4s'kP7`,q
   Total      61 buffers, 976 bytes5F1E-ya t3{)L]2R
>Bv8[a xt1Ez1f
可以看到libstdc++.so.6.0.3`_Znwj+0x29有60个leaked,根据bufctl的地址查看bufctl的信息。
~ZX5D2MnK(Y7~_ x > 0807f2f0::bufctl -vdZXI {,w!k H%p#a
            ADDR          BUFADDR        TIMESTAMP           THREAD
!w$SjD!Gb9j(g.W1D                             CACHE          LASTLOG         CONTENTS/N L9OI!u7ipZV{
         807f2f0          8079fa0     ad78129dfba5                1(~V.Z.@M k
                          806a290                0                00V3E)H R@~
                 libumem.so.1`umem_cache_alloc_debug+0x144
sC,~9aN2I                  libumem.so.1`umem_cache_alloc+0x153
#n1SB$DS'h                  libumem.so.1`umem_alloc+0xcd
b| {/]%x(z{                  libumem.so.1`malloc+0x2a/X [#vvV7W@
                 libstdc++.so.6.0.3`_Znwj+0x29
'VqwtJl:G O                  main+0x27
;P[/`Z[ m3fxV#Z                  _start+0x80
5R%ipK7V [align=center][attach]871[/attach][/align]

原创粉丝点击