[简单实践]Linux c++上常用内存泄露检测工具有valgrind, Linux C/C++ 内存泄漏检测工具:Valgrind。

jackxiang 2011-8-13 17:01 | |
Linux c++上常用内存泄露检测工具有valgrind, Rational purify。Valgrind免费。Valgrind 可以在 32 位或 64 位 PowerPC/Linux 内核上工作。
Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind, Callgrind,Massif。下面分别介绍个工具的作用:
Memcheck 工具主要检查下面的程序错误:
• 使用未初始化的内存 (Use of uninitialised memory)
• 使用已经释放了的内存 (Reading/writing memory after it has been free’d)
• 使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)
• 对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)
• 申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)
• malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
• src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions)
Valgrind不检查静态分配数组的使用情况。
Valgrind占用了更多的内存--可达两倍于你程序的正常使用量。如果你用Valgrind来检测使用大量内存的程序就会遇到问题,它可能会用很长的时间来运行测试
2.1. 下载安装
http://www.valgrind.org
安装
./configure;make;make install
2.2. 编译程序
被检测程序加入 –g   -fno-inline 编译选项保留调试信息。

2.3. 内存泄露检测
$ valgrind --leak-check=full --show-reachable=yes --trace-children=yes    ./iquery   -f ../conf/se.conf_forum -t   ~/eragon/forum_thread_data/f.log -NT   -cache 0
其中--leak-check=full 指的是完全检查内存泄漏,--show-reachable=yes是显示内存泄漏的地点,--trace-children=yes是跟入子进程。当程序正常退出的时候valgrind自然会输出内存泄漏的信息。

来自: http://hi.baidu.com/benbendy/blog/item/905f7638a3233bfab211c709.html
参看:http://zyan.cc/post/419/

—————————————————试着调一个epoll的多进程测试小程序————————————————————
刚运行起来没有泄漏,多请求几次后再ctrl+C退出时,发现有泄漏情况了,如下所示:
[root@test multepoolserver]# valgrind --tool=memcheck --leak-check=full ./multipepollserver


一查原因,两条遗漏:
for (i = 0; envp[i] != NULL; i++)                  
    environ[i] = strdup(envp[i]);//xstrdup(envp[i]);
environ[i] = NULL;
1.这个for没有把:environ[i] = NULL; 给括号进来,没有释放掉?不对:
strdup
(gdb) print *envp
$2 = 0x7fff72df6afa "HOSTNAME=test.local"
$4 = 0x7fff72df6ac8 "/home/xiangdong/multepoolserver/multipepollserver"
2.没有free掉char *:char * httpmut_prename_child_buf="worker process"; /* 原命令行参数:子进程名字。 */
prename_setproctitle("[httpmut: worker process] %s", httpmut_prename_child_buf);
free(httpmut_prename_child_buf);//这个得free掉。

==26827==    by 0x4029CA: main (multipepollserver.cpp:484)
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x0000003c9a27272e in free () from /lib64/libc.so.6
(gdb) bt
#0  0x0000003c9a27272e in free () from /lib64/libc.so.6
#1  0x00000000004029e7 in main (argc=1, argv=0x7fff72df4e08, envp=0x7fff72df4e18) at multipepollserver.cpp:486


用ab.exe压力一下?
D:\wamp\bin\apache\apache2.2.22\bin\ab.exe -c 1000 -n 1000 http://t.jackxiang.com
会提示:[http://]hostname[:port]/path
D:\wamp\bin\apache\apache2.2.22\bin\ab.exe -c 1000 -n 1000 http://t.jackxiang.com/

C语言调指针可真是个小心活儿,还得有工具,有经验啊EOF。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/4543/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-2-11 16:59
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]