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 がリークの可能性がないと報告したとしても、どこかでヒープから割り当てを解除する必要があるということですか?

ありがとう!

編集:ゴードン・ベイリーの答えと他のヒントで、私はまだ少し疲れています. この小さなアプリを書きました:

/* 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

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)

プログラムでは、サイズが1バイトの1000のmallocを実行し、次に1000のフリーを実行します。これにより、出力が説明されます。

よろしく。

于 2012-07-30T23:16:17.450 に答える
0

これは、すべての malloc (および同様の) 呼び出しのサイズの合計です。valgrind が言っているように、それを解放した場合、問題はありません。つまり、プロセス 27526 は合計 283,043 バイトに対して 113 の割り当てを行いました。

サーバーがメモリを割り当て続けると、その数は増えますが、free() を呼び出してもその数は減りません。

于 2012-07-30T22:04:32.547 に答える
0

問題は、アプリケーションを実行すると、ループごとに解放と割り当ての数が増えることだと思います。これにより、実際の割り当てが増えるにつれて割り当てが実際により多くのメモリを割り当てるたびに、割り当てられたバイト数が大きくなります。

なぜそれが起こっているのかわかりませんが、それは私のバグのあるコードであるに違いなく、別の質問にあるはずです.

助けてくれてありがとう!

于 2012-07-30T23:28:44.270 に答える