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
export UMEM_DEBUG=default
export UMEM_LOGGING=transaction,yOTb%s/g:D
export LD_PRELOAD=libumem.so.1
m)H2V;b nrnYk4U
下面这个程序有明星的内存泄露。申请的内存没有被释放掉。
使用ps -ef 找到运行程序的pid,使用gcore生成一个core文件,利用mdb打开core文件
bash-3.2# mdb core.237*S2^2E*w|d)@
Loading modules: [ libumem.so.1 ld.so.1 ]4u.i5{TC%Vw
> ::findleaks
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
------------------------------------------------------------------------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的信息。
> 0807f2f0::bufctl -vdZXI {,w!k H%p#a
ADDR BUFADDR TIMESTAMP THREAD
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
libumem.so.1`umem_cache_alloc+0x153
libumem.so.1`umem_alloc+0xcd
libumem.so.1`malloc+0x2a/X [#vvV7W@
libstdc++.so.6.0.3`_Znwj+0x29
main+0x27
_start+0x80
[align=center][attach]871[/attach][/align]