您的位置:首页 > 其它

使用DBX检查内存泄漏

2010-10-15 17:25 330 查看
使用sunstudio中的工具DBX可以进行内存泄漏检查。
A.直接启动的程序
1)编译时指定生成debug信息选项。
例如:CC -g -o memcheck.exe memcheck.cc
2)启动dbx。
$ dbx
(dbx) debug memcheck.exe
(dbx) check -leaks
(dbx) run
3)程序结束后会自动打出泄漏情况。
*可以为check命令指定的参数:all|access|memuse
*access指定为on,会检查运行错误。
默认情况下rtc_auto_continue 环境变量设置为off,出现运行错误时,会停止在错误处。
若设为on,则运行时检查会继续查找错误,并自动保持运行。
它会将错误重定向到通过dbx 环境变量rtc_error_log_file_name 指定的文件。
*可以通过dbxenv来指定输出详细泄漏情况:(dbx) dbxenv rtc_mel_at_exit verbose
(on|off|verbose)

B.Attach到已经启动的程序
一般Server程序不会停止,并且有些程序可能是通过脚本或者其他程序来启动的。
这种情况下dbx一般是通过attach命令连接到正在执行的程序。
可以用以下步骤来进行内存泄漏测试。
1)编译时指定生成debug信息选项。
2)缺省情况下在程序启动时没有加载rtcaudit.so,必须在启动前指定LD_AUDIT环境变量来使得程序加载rtcaudit.so。
$ LD_AUDIT=/opt/SUNWspro/lib/rtcaudit.so;export LD_AUDIT
3)启动程序。
启动后去掉LD_AUDIT环境变量避免不必要的rtcaudit.so载入。
$ unset LD_AUDIT
4)启动dbx并连接到待测试的程序。
$ dbx
(dbx) attach {pid}
(dbx) dbxenv mt_sync_tracking off
(dbx) check -leaks
(这一步可能需要等待很长时间才结束)
5)调用cont继续执行程序。
6)需要的时候中断程序,调用showleaks来得到测试结果。可以给showleaks指定选项。
-a:showleaks命令缺省只报告自上次报告内存泄漏后新发现的内存泄漏。指定-a则报告所有内存泄漏。
-v:verbose模式,详细报告。
*注意要一定要加载合适版本的rtcaudit.so。否则会得到类似如下的错误并且无法测试内存泄漏情况。
warning: /opt/SUNWspro/lib/rtcaudit.so: wrong ELF class: ELFCLASS32
如果sunstudio安装在/opt目录中,则rtcaudit.so位于:
/opt/SUNWspro/lib/v9/rtcaudit.so(对于64 位SPARC 平台)
/opt/SUNWspro/lib/amd64/rtcaudit.so(对于AMD64 平台)
/opt/SUNWspro/lib(对于32 位平台)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: