如何在运行时使用Valgrind检查实际内存泄漏
How to check actual memory leaks during runtime using Valgrind?
在某些程序中,一些分配的内存根本不会被破坏,但它们是程序整个运行时间所必需的。因此,一般认为是安全的。
但是,还有一些其他对象并不适用于程序的整个运行时间,但由于开发人员的失误而没有被销毁。这些是应该解决的实际内存泄漏。
当我们运行下面的Valgrind命令时,它只显示程序执行结束后的总泄漏。因此,有人能澄清如何将上述两种情况与Valgrind泄漏检查输出区分开来吗。
我用来检测内存泄漏的命令;
valgrind --log-file=valgrind_output.txt --tool=memcheck --leak-check=yes ./MyTestProgram
执行结束时的典型输出;
==10108== LEAK SUMMARY:
==10108== definitely lost: 392,323 bytes in 1,164 blocks
==10108== indirectly lost: 178,120 bytes in 4,283 blocks
==10108== possibly lost: 170,155,118 bytes in 3,347,087 blocks
==10108== still reachable: 263,778,326 bytes in 3,935,669 blocks
Valgrind中是否有类似IBM Purify工具中Tap的功能,可以在运行时检测当前泄漏的内存?
您可以使用两种不同的技术在执行过程中进行泄漏搜索。
-
从shell命令启动vgdb泄漏检查leak_check监视器命令还有其他可选参数,例如找到可访问的内存,或者只是增加的内存或。。。。详见valgrind用户手册:http://www.valgrind.org/docs/manual/mc-manual.html#mc-手动监视器命令
-
在您的程序中:您可以在程序中添加客户端请求以进行泄漏搜索。例如,插入对VALGRIND_DO_LEAK_CHECK或VALGRIND_DO_ADDED_LEAK_CHECK的"调用"看见http://www.valgrind.org/docs/manual/mc-manual.html#mc-手动客户端有关更多详细信息,
Valgrind中是否有类似IBM Purify工具中Tap的功能,可以在运行时检测当前泄漏的内存?
不,没有。除非程序完成,否则Valgrind无法知道是否存在泄漏,因为它不知道程序结束时会发布什么。
您可以让程序在运行过程中故意崩溃,以确保您可以在此时检查分配的内存。您可以通过为一些用户定义的信号(如SIGUSR1)添加一个信号处理程序来实现这一点。
signal(SIGUSR1, myhandler);
在你的处理程序中,你会做这样的事情:
printf("debug exit!n");
int *ptr = 0;
*ptr = 0xdeadbeef;
然后你可以像这样将这个信号发送到你的应用程序:
kill -s SIGUSR1 `ps -aux| grep myapp | head -n -1 | awk '{print $2}'`
然后,您可以检查已分配对象数量的差异。如果你知道数字应该保持不变,或者某个数字一直在增长,那么你可以检查发生这种情况的地方,看看那里是否有内存泄漏。
- 检查nullptr是否100%保护内存布局不受segfault影响
- 使用 valgrind 检查我的链表暗示中的内存泄漏,让我"肯定丢失:1 个块中有 40 个字节"
- 如何使用 Malloc 调试来检查本机内存泄漏?
- 如何在c/c++中检查两个任意内存范围是否重叠
- 投射空指针以检查内存对齐情况
- 有没有办法检查内存缓存是否已重新启动?
- 检查内存是否在堆上
- 检查内存泄漏问题
- 检查内存泄漏
- c++:执行动态分配的新运算符检查内存安全性
- 检查内存泄漏
- 我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?
- 如何在C++中检查内存损坏
- 二进制搜索树(如何在插入时检查内存是否不足)
- 使用boost日志,Valgrind检查内存泄漏
- 如何检查内存分配是否仍然有效
- 检查内存值
- 如何检查内存块中的所有字节是否为零
- 如何使用new操作符检查内存分配失败
- 免费应用程序检查内存泄漏在Windows x64