5

「単純な」メモリ リーク チェッカーを作成したいと考えています。

そのためにはmalloc()、プログラム内の ed メモリ ブロックの数を数える必要がありますが、それを変更したくないという問題はソースです。

つまり、次のインターフェイスを実装したいと考えています。

memory_check <executable name>

実行可能ファイルのソースにアクセスできない場所。

まず、システムコールをインターセプトしようとしました。しかし、「だからmallocはsyscallを呼び出さないのですか? 」と読んだのですが、すべてのシステムが非常に遅くなるため(私が推測できるように)、それは考えではないようです。

malloc()通話を傍受する他のオプションはありますか?

4

2 に答える 2

5

インターフェイスを次のように変更する場合はLD_PRELOAD=mymalloc.so <executable>、次のようにします。

  • 共有ライブラリを作成する
    • malloc使用するためのハンドルを取得しますdlsym
    • 外部を公開しますvoid *malloc(size_t size)
    • malloc上記で取得したハンドルを介して実数を呼び出し、デバッグ情報も保存します

それで:

  • プログラムを呼び出すLD_PRELOAD=mymalloc.so ./program
  • プログラムは自動的に「乗っ取られた」バージョンのmalloc

編集

インターフェイスを変更したくないが、このトリックを使用したい場合は、その名前を使用して実際のプログラムをfork(2)セットアップし、実行するラッパープログラムを作成できます。LD_PRELOAD

于 2013-03-03T07:51:14.390 に答える
0

実行可能ファイルが動的にリンクされている場合は、独自の malloc を記述して .so にビルドできます。独自の malloc で、カウンターをインクリメントするだけです。

#ifdef malloc
#undef malloc
#endif

static int count;
void *malloc(size_t size)
{
    count++;
    return _malloc(size);
}

次に、LD_PRELOAD を使用して独自の malloc をプリロードします。

于 2013-03-03T07:56:00.233 に答える