我感觉我的程序有内存泄露,但是为什么valgrind检测结果每次都是OK的呢?

martingod 2011-10-11 10:46:12

程序test运行大约一天左右,在所有业务流程已经终止情况下,通过ps命令查询结果如下:
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2286 pts/0 S 0:00 1 50 163793 40604 2.3 test
我记得刚启动的时候%MEN列是0.4的,另外再过一天左右这个数值会变成大约5.0,因此我感觉此程序有内存泄露(也不知道我的这个土方法对不对哈)。

网上查的说valgrind很管用,下载安装后查询结果如下,居然只说有16字节的泄露,而且这个还是glib启动时创建的loop,本身就是不释放,到底是valgrind有问题还是我的参数方法不对,请高手指点,谢谢
/usr/local/webserver/valgrind/bin/valgrind --tool=memcheck --leak-check=full ./test
==15972== Memcheck, a memory error detector.
==15972== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
==15972== Using LibVEX rev 1884, a library for dynamic binary translation.
==15972== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
==15972== Using valgrind-3.4.1, a dynamic binary instrumentation framework.
==15972== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
==15972== For more details, rerun with: -v
==15972==

==15972== 16 bytes in 1 blocks are definitely lost in loss record 1 of 3
==15972== at 0x4A050CC: calloc (vg_replace_malloc.c:397)
==15972== by 0x4C59CB2: g_malloc0 (gmem.c:151)
==15972== by 0x4C53569: g_main_loop_new (gmain.c:2869)
==15972== by 0x4083D8: main (test.c:518)
==15972==
==15972== LEAK SUMMARY:
==15972== definitely lost: 16 bytes in 1 blocks.
==15972== possibly lost: 0 bytes in 0 blocks.
==15972== still reachable: 4,460 bytes in 9 blocks.
==15972== suppressed: 0 bytes in 0 blocks.
==15972== Reachable blocks (those to which a pointer was found) are not shown.
==15972== To see them, rerun with: --leak-check=full --show-reachable=yes
...全文
302 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
martingod 2011-10-14
  • 打赏
  • 举报
回复
问题已经解决,原因是我对valgrind原理理解错误。
下面命令是通过valgrind启动一个进程,并对这个进程进行检测。
而我实际的业务进程已经存在,因此如果要检测业务进程需要先停止原来的,再通过下面命令把它起起来才行
/usr/local/webserver/valgrind/bin/valgrind --tool=memcheck --leak-check=full ./test
martingod 2011-10-14
  • 打赏
  • 举报
回复
自顶自顶自顶
martingod 2011-10-13
  • 打赏
  • 举报
回复
我在test.c中临时加了行malloc,重新编译,valgrind检测结果仍然没有报告。请问这是怎么回事啊??
积木 2011-10-12
  • 打赏
  • 举报
回复
看看有没有没有关闭的文件句柄之类的吧。这些东西valgrind是无能为力的。
martingod 2011-10-12
  • 打赏
  • 举报
回复
我的理解是,碎片也应该被统计为still reachable才对
ma100 2011-10-12
  • 打赏
  • 举报
回复
会不会是内存碎片,比如频繁的用stl的东西
martingod 2011-10-12
  • 打赏
  • 举报
回复
加分到100,求valgrind高手解答
martingod 2011-10-12
  • 打赏
  • 举报
回复
感觉楼上几位没明白我的意思啊。
to 三楼兄弟:我知道那个属于静态内存性质,不会销毁。我的意思是应该有其他内存没释放信息,为什么工具没检查出来。
to 四楼兄弟:==15972== still reachable: 4,460 bytes in 9 blocks.这条信息从进程创建开始到现在一直是这么多,没变过。但是ps-v查出来的进程使用内存已经翻倍了。


今天刚又查了下,test进程使用的内存已经5.1%了,比昨天查出来的又多了一倍。当前业务已经是停止状态,内存多用了这么多,但是valgrind检查的报告还是和之前没有任何变化。
martingod 2011-10-11
  • 打赏
  • 举报
回复
顶,等待高手
ganjianh8 2011-10-11
  • 打赏
  • 举报
回复
==15972== still reachable: 4,460 bytes in 9 blocks.

valgrind好像有个选项可以看reachable的,这个就是静态内存
ganjianh8 2011-10-11
  • 打赏
  • 举报
回复
那个是静态内存(全局变量之类),当调用一个库的时候就会创建,然后不会销毁的。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧