4

在某些程序中,一些分配的内存根本不会被破坏,但它们是程序整个运行时间所必需的。因此,通常被认为是安全的。

但是还有其他一些对象并不打算用于程序的整个运行时间,但不会由于开发人员的失误而被破坏。这些是应该解决的实际内存泄漏。

当我们运行以下 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 的功能,可以在运行时检测当前泄漏的内存?

4

3 回答 3

4

您可以在执行期间使用 2 种不同的技术进行泄漏搜索。

  1. 从 shell 命令,启动 vgdb leak_check leak_check 监控命令还有其他可选参数,例如查找可访问的内存,或者只是增加的内存或...。有关详细信息,请参阅 valgrind 用户手册: http://www.valgrind。 org/docs/manual/mc-manual.html#mc-manual.monitor-commands

  2. 在您的程序内部:您可以在程序中添加客户端请求以进行泄漏搜索。例如,向 VALGRIND_DO_LEAK_CHECK 或 VALGRIND_DO_ADDED_LEAK_CHECK 插入“调用” 有关 详细信息,请参阅http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs

于 2014-10-02T19:45:50.933 回答
1

Valgrind 中是否有类似 IBM Purify 工具中的 Tap 的功能,可以在运行时检测当前泄漏的内存?

不,没有。Valgrind 无法知道是否有泄漏,除非程序结束,因为它无法知道程序结束时会释放什么。

于 2014-10-01T08:44:35.967 回答
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}'`

然后您可以检查分配对象数量的差异。如果您知道数字应该保持不变或者某个数字不断增长,那么您可以检查发生这种情况的地方,看看那里是否有内存泄漏。

于 2016-01-07T09:12:23.487 回答