3

我一直在研究调试分叉 TCP 服务器中的内存使用情况。我认为我做得很好,我似乎无法在“堆摘要”中找到有关“分配的字节数”的信息。我的服务器运行时间越长,这个数字似乎就在不断增加:

==27526== 
==27526== HEAP SUMMARY:
==27526==     in use at exit: 0 bytes in 0 blocks
==27526==   total heap usage: 113 allocs, 113 frees, 283,043 bytes allocated
==27526== 
==27526== All heap blocks were freed -- no leaks are possible
==27526== 
==27526== For counts of detected and suppressed errors, rerun with: -v
==27526== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==27528== 
==27528== HEAP SUMMARY:
==27528==     in use at exit: 0 bytes in 0 blocks
==27528==   total heap usage: 120 allocs, 120 frees, 300,808 bytes allocated
==27528== 
==27528== All heap blocks were freed -- no leaks are possible
==27528== 
==27528== For counts of detected and suppressed errors, rerun with: -v
==27528== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==27537== 
==27537== HEAP SUMMARY:
==27537==     in use at exit: 0 bytes in 0 blocks
==27537==   total heap usage: 127 allocs, 127 frees, 318,573 bytes allocated
==27537== 
==27537== All heap blocks were freed -- no leaks are possible
==27537== 
==27537== For counts of detected and suppressed errors, rerun with: -v
==27537== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

尽管 Valgrind 报告 allocs 和 free 是相等的,并且不可能发生泄漏,但我不相信分配的字节会增加。

所以:如果分配的字节数不断增加,这是否意味着即使 Valgrind 报告不可能发生泄漏,我也必须从堆中的某个地方解除分配?

谢谢!

编辑:随着 Gordon Bailey 的回答和其他提示,我仍然有点厌倦。写了这个小应用程序:

/* client.c */
#include <stdio.h>

void child_func(int childnum);

int main(int argc, char *argv[])
{
int nchildren = 1;
int pid;
int x;
if (argc > 1)
{
    nchildren = atoi(argv[1]);
}

for (x = 0; x < nchildren; x++)
{
    if ((pid = fork()) == 0)
    {
        child_func(x + 1);
        exit(0);
    }
}
wait(NULL);
return 0;
}

void child_func(int childnum)
{

int i;
for (i = 0; i < 1000; i++) {
            free(malloc(1));
    }
    sleep(1);
}

当我运行这个 Valgrind 输出是:

==28245== HEAP SUMMARY:
==28245==     in use at exit: 0 bytes in 0 blocks
==28245==   total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==28245== 
==28245== All heap blocks were freed -- no leaks are possible
==28245== 
==28245== For counts of detected and suppressed errors, rerun with: -v
==28245== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
==28246== HEAP SUMMARY:
==28246==     in use at exit: 0 bytes in 0 blocks
==28246==   total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==28246== 
==28246== All heap blocks were freed -- no leaks are possible

所以看起来堆上的所有内存都被清除了,并且与我的应用程序的输出肯定不同。

4

4 回答 4

3

Valgrindbytes allocated是您在进程运行时分配的总字节数。

如果你编译并运行这个奇怪的小测试程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i;

   for(i = 0; i < 1000; ++i){
      free(malloc(1));
   }

   return 0;
}

Valgrind 的输出是:

==2651== Memcheck, a memory error detector
==2651== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==2651== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==2651== Command: ./test_prog
==2651==
==2651==
==2651== HEAP SUMMARY:
==2651==     in use at exit: 0 bytes in 0 blocks
==2651==   total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==2651==
==2651== All heap blocks were freed -- no leaks are possible
==2651==
==2651== For counts of detected and suppressed errors, rerun with: -v
==2651== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8)

现在看来真正的问题是子进程如何影响这一点。

(编辑以确认我的想法)

于 2012-07-30T22:07:07.360 回答
0

我认为问题在于,当我运行应用程序时,释放和分配的数量会增加每个循环。这导致分配的字节数变得更大,因为每次分配实际分配更多内存,因为有更多实际分配。

不知道为什么会这样,但它一定是我的错误代码,应该是另一个问题。

谢谢您的帮助!

于 2012-07-30T23:28:44.270 回答
0

它只是所有 malloc(和类似)调用的大小总和。如果你已经释放了它,valgrind 说你有,那就没问题了。即你的进程 27526 做了 113 次分配,总共 283,043 个字节,

如果您的服务器继续分配内存,该数字会上升,调用 free() 不会减少该数字。

于 2012-07-30T22:04:32.547 回答
0

正如 Godron 所说,valgrind 输出当前进程中的所有内存分配:

toc@UnixServer:~$ valgrind --leak-check=full ./pb_valgrind
==11411== Memcheck, a memory error detector
==11411== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==11411== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==11411== Command: ./pb_valgrind
==11411== 
==11414== 
==11414== HEAP SUMMARY:
==11414==     in use at exit: 0 bytes in 0 blocks
==11414==   total heap usage: 1,000 allocs, 1,000 frees, 1,000 bytes allocated
==11414== 
==11414== All heap blocks were freed -- no leaks are possible
==11414== 
==11414== For counts of detected and suppressed errors, rerun with: -v
==11414== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)
==11411== 
==11411== HEAP SUMMARY:
==11411==     in use at exit: 0 bytes in 0 blocks
==11411==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==11411== 
==11411== All heap blocks were freed -- no leaks are possible
==11411== 
==11411== For counts of detected and suppressed errors, rerun with: -v
==11411== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)

在您的程序中,您执行 1000 个大小为 1 字节的 malloc,然后执行 1000 个空闲,这解释了输出。

问候。

于 2012-07-30T23:16:17.450 回答