4

一部のプログラムでは、割り当てられたメモリの一部がまったく破棄されませんが、プログラムの実行時間全体に必要です。したがって、一般的に安全であると考えられています。

しかし、プログラムの実行時間全体を意図していないが、開発者のミスのために破棄されていない他のオブジェクトがあります。これらは、対処する必要がある実際のメモリ リークです。

次の Valgrind コマンドを実行すると、プログラムの実行が終了した後の合計リークのみが表示されます。したがって、上記の 2 つのシナリオを 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

実行時に現在リークされているメモリを検出できる、IBM Purify ツールの Tap のような Valgrind の機能はありますか?

4

3 に答える 3

4

実行中にリーク検索を行うには、2 つの異なる手法を使用できます。

  1. シェル コマンドから、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 に「呼び出し」を挿入 ます

于 2014-10-02T19:45:50.933 に答える
1

実行時に現在リークされているメモリを検出できる、IBM Purify ツールの Tap のような Valgrind の機能はありますか?

いいえ、ありません。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 に答える