Solaris下使用mdb检查内存泄露


Solaris下使用mdb检查内存泄露

步骤一:

UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1 ./spAgent &

步骤二:

-bash-3.00$ mdb -p 16546 //上面得到进程ID
Loading modules: [ ld.so.1 libumem.so.1 libc.so.1 ]

步骤三:
-bash-3.00$ mdb -p 16546
Loading modules: [ ld.so.1 libumem.so.1 libc.so.1 ]
> ::findleaks //查找内存泄露
CACHE    LEAKED  BUFCTL CALLER
00484008  11489 00a7f428 libstdc++.so.6.0.3`_Znwj+0x1c
----------------------------------------------------------------------
  Total  11489 buffers, 5147072 bytes

步骤四:

> 00a7f428::bufctl_audit  //查看最后使用这内存地址的调用堆栈
            ADDR          BUFADDR        TIMESTAMP          THREAD
                            CACHE          LASTLOG        CONTENTS
          a7f428          a85a00  2185ef54480864              47
                          484008          3165dc                0
                libumem.so.1`umem_cache_alloc+0x13c
                libumem.so.1`umem_alloc+0x60
                libumem.so.1`malloc+0x28
                libstdc++.so.6.0.3`_Znwj+0x1c
                _ZN6RXConn17HandleSMPPDeliverEPK7AIChunki+0x510
                _ZN6RXConn10RecvThreadEv+0x6c4
                _ZN6RXConn4RecvEPv+0x20
                libc.so.1`_lwp_start

通过以上步骤基本可以定位内存泄露发生在xx函数。

相关内容