8

Apache httpdおよびhttpdモジュールのメモリリークを見つけるための最良の方法は何ですか?

ハウツーはありますか?

valgrindを少し試しましたが、いくつかの障害が発生しました。

  1. Valgrindは、バイナリが正常に終了することを期待しています。私はMaxRequestsPerChildと-Xパラメーターでそれを行うことができました。
  2. Valgrindは、おそらくaprプールに関連していると思われる多くのことについて報告していますが、有用なものは何もありません。

OS:Linux

PS:

Valgrindコマンド:$ valgrind --leak-check=full --leak-resolution=med --log-file=/tmp/valgrind.log ./bin/httpd -X

Valgrindの出力例:http://paste-it.net/public/x5b6e8b/

4

3 に答える 3

2

魔法の弾丸はわかりませんが、 valgrind / valgrind.hを見ることができます。これには、Valgrindを認識させ、Valgrindで実行している場合の動作を変更するための便利なマクロがいくつかあります。

例えば

#ifndef HAVE_VALGRIND_VALGRIND_H
#define RUNNING_ON_VALGRIND 0
#else
#include <valgrind/valgrind.h>
#endif

if (RUNNING_ON_VALGRIND) {
    printf("Hello, this is Valgrind instance %d\n", RUNNING_ON_VALGRIND);
    /* set debug output annoyingly high */
    /* exit after one request */
}

NDEBUGまた、本番ビルドから除外するために、その全体を混乱させることもできます。

これにより、デバッグするたびにサーバーをいじる必要がなくなり、Valgrindが検出された場合にサーバーが「実行する」だけになります。RUNNING_ON_VALGRINDはvalgrindインスタンスに展開されるか、該当しない場合は0のままになります。

残りの部分(そして、おそらくはから始まる大量のノイズが発生していると思いますinvalid read of size xx)については、抑制を体系的に適用できます。出力の一部を投稿すると、ファイルに貼り付けることができる抑制の提案を行う方が簡単な場合があります。

ちなみに、Valgrindユーザーのメーリングリストは非常に役立ち、非常に寛容です。また、そこに最も迷惑で無関係なノイズを投稿することもできます。それをかなり迅速に抑制する方法についての返信があります。

リークの概要とその原因となったエントリポイントだけが必要な場合は、他のほとんどすべてをシャットダウンするのはそれほど難しくありません。

于 2010-02-16T08:36:56.357 に答える
0

Bohem GCを統合して、ガベージコレクションでメモリリークを検出してみてください。

ハウツーについては、こちらをご覧ください:
http ://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

于 2010-03-06T14:29:53.170 に答える
0

たぶん、apacheの外でテストを実行できるように、コードをリファクタリングする時が来たのでしょうか。

メモリを割り当てるコードパスをチェックする単体テストを追加する場合、valgrindで単体テストを実行することにより、すべてのメモリが解放されていることを確認できます。そうすれば、apacheで実行されている完全なコードが少数のトランザクションのみを処理するようにすることを心配する必要はありません。また、単体テストを使用してすべてのコードパスをテストする方が簡単です。

于 2010-03-10T14:44:49.747 に答える