1

Linuxを実行しているPPCシステムにデプロイされているアプリケーションのメモリリークなどのエラーを主に監視するために、および(およびその他)lib_debugをオーバーライドするヒープアナライザー(参照用)を作成しました。共有ライブラリとしてコンパイルされ、必要に応じてロードされます。freemalloclib_debugLD_PRELOAD

このデバッガーはこれまでうまく機能してきました。が呼び出されるたびmallocに、メモリモニターシングルトンがスタック上に作成されます。このシングルトンは、終了時にスコープから外れると、解放されていないメモリについて報告します。

ただし、アプリケーションの1つがstd::vectorグローバルスコープでを割り当てます。このグローバルvectorは、ヒープアナライザーが作成される前に作成されており、最も重要なのは後で破棄されているようです。したがって、これにmain何かを挿入すると、シャットダウン時にメモリリークが発生したと見なされます。vectorlib_debug

説明のために、これは私がイベントのシーケンスであると私が信じているものです:

  1. LD_PRELOADからシンボルをロードしますlib_debug;
  2. std::vectorグローバルスコープでスタック上に作成されます。
  3. lib_debug初期化が発生します-mallocどこかで呼び出され、実際のヒープアナライザシングルトンがスタック上に作成されます。
  4. 入力main;
  5. std::vector::push_back()発生し、ヒープにメモリを割り当てます。
  6. main終了します。
  7. ヒープアナライザのlib_debugシングルトンがスコープ外になり、vectorメモリが解放されていないことがわかります-エラーが報告されます。
  8. vectorグローバルスコープから外れ、メモリを解放します。
  9. プログラムが終了します。

LD_PRELOADedしたがって、シングルトンが常に最後に削除されることを保証しfree、アプリケーションで発生するすべてのシングルをキャッチする方法はありますか?

4

1 に答える 1

0

GCCこれは、コンパイラとして使用している場合に機能します。ライブラリ内の関数を定義して、として機能させることができますconstructor。これにより、ライブラリがロードされたときにコードが実行されます。

static int initialize_lib_debug () __attribute__((constructor));

static int initialize_lib_debug () {
    /* ... */
}
于 2012-08-03T17:05:52.153 に答える