在某些程序中,某些已分配的内存根本不会被销毁,但它们在程序的整个运行时间内都是必需的。因此,通常认为是安全的。
但是还有其他对象不是针对程序的整个运行时间,而是由于开发人员未命中而未被破坏。这些是应该解决的实际内存泄漏。
当我们运行以下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那样可以在运行时检测当前泄漏的内存?
答案 0 :(得分:3)
您可以使用2种不同的技术在执行期间进行泄漏搜索。
从shell命令启动 vgdb leak_check leak_check监视器命令还有其他可选参数,例如至 找到可达的内存,或只是增加的内存或.... 有关详细信息,请参阅valgrind用户手册: http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands
在您的计划中: 您可以在程序中添加客户端请求以进行泄漏搜索。 例如。插入"电话"到VALGRIND_DO_LEAK_CHECK或VALGRIND_DO_ADDED_LEAK_CHECK 看到 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 了解更多详情
答案 1 :(得分:2)
Valgrind中是否有像IBM Purify工具中的Tap那样可以在运行时检测当前泄漏的内存?
不,没有。 Valgrind不知道是否有泄漏,除非程序结束,因为它无法知道程序结束时会释放什么。
答案 2 :(得分:0)
您可以在运行期间故意使程序崩溃,以确保您可以在此时检查已分配的内存。您可以通过为某些用户定义的信号(如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}'`
然后您可以检查分配对象数量的差异。如果您知道数字应保持相同或者某个数字不断增长,那么您可以检查发生这种情况的地方,看看那里是否有内存泄漏。