0

メモリリークのケースを示す valgrind のサンプルコードを調べている間、私は2つのことを理解していません:

  1. メモリリークで到達可能または失われたバイト数が負になる可能性はありますか? バイト数にマイナス記号が付いているのはどういう意味ですか?
  2. breakme()ステートメントのない空の関数の必要性は何ですか? 何もしないとき、それはどのような目的に役立ちますか?

#include <stdio.h>
#include <stdlib.h>
#include "../memcheck.h"
#include "leak.h"

char *b10;
char *b21;

char *b32_33[2];
static void breakme() {};
void f(void)
{
   int i;

   b10 = malloc (10);

   fprintf(stderr, "expecting details 10 bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_LEAK_CHECK;

   fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
   VALGRIND_DO_ADDED_LEAK_CHECK;

   b10--; // lose b10
   b21 = malloc (21);
   fprintf(stderr, "expecting details +10 bytes lost, +21 bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_ADDED_LEAK_CHECK;

   for (i = 0; i < 2; i ++)
      b32_33[i] = malloc (32+i);
   fprintf(stderr, "expecting details +65 bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_ADDED_LEAK_CHECK;

   fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
   VALGRIND_DO_ADDED_LEAK_CHECK;

   b10++;
   fprintf(stderr, "expecting details +10 bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_ADDED_LEAK_CHECK;

   b10--;
   fprintf(stderr, "expecting details -10 bytes reachable, +10 bytes lost\n"); fflush(stderr); breakme();
   VALGRIND_DO_CHANGED_LEAK_CHECK;

   b10++;
   fprintf(stderr, "expecting details -10 bytes lost, +10 bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_CHANGED_LEAK_CHECK;

   b32_33[0]--;
   fprintf(stderr, "expecting details 32 (+32) bytes lost, 33 (-32) bytes reachable\n"); fflush(stderr); breakme();
   VALGRIND_DO_CHANGED_LEAK_CHECK;

   fprintf(stderr, "finished\n");
}

int main(void)
{
   DECLARE_LEAK_COUNTERS;

   GET_INITIAL_LEAK_COUNTS;

   f();   // see leak-cases.c


   GET_FINAL_LEAK_COUNTS;

   PRINT_LEAK_COUNTS(stderr);

   return 0;
}
4

1 に答える 1

0

リーク検索を実行して、リークしたメモリの「絶対数」を表示できます。通常、このようなリーク検索は、プログラムの実行の最後に行われます。実行中にいくつかのリーク検索を行う場合、リーク検索は (要求した場合) 前回のリーク検索と比較してリークしたメモリの「デルタ」を表示できます。通常、これらのいくつかのリーク検索は、Valgrind 組み込み gdbserver (監視コマンドを送信する GDB に接続) を介して、または VALGRIND_DO_ADDED_LEAK_CHECK などのクライアント要求を介して、またはシェルで (vgdb を使用して監視コマンドを送信します) 実行されます。

このようなデルタ リーク検索では、リークしたメモリが増加しているスタック トレースのみを表示したり、変化 (増加または減少) しているスタック トレースを表示したりできます。

詳細については、 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands および http://www.valgrind.org/docs/manual/mc-manualを参照してください。 .html#mc-manual.clientreqs

関数 breakme は、自動 Valgrind リグレッション テストを実行しやすくするためにあります。GDB が起動され、関数 breakme 内にブレークが配置されます。Valgrind ディストリビューションでは、perl スクリプト tests/vg_regtest.in がテスト ドライバーであり、Valgrind とオプションで 2 番目のプロセス (Valgrind gdbserver をテストするテストでは GDB) を開始します。これ (および breakme 関数の使用方法) の詳細については、tests/vg_regtest.in のコメントと gdbserver_tests/mcleak.* を参照してください。

于 2012-12-17T23:38:55.023 に答える