Linuxを実行しているPPCシステムにデプロイされているアプリケーションのメモリリークなどのエラーを主に監視するために、および(およびその他)lib_debug
をオーバーライドするヒープアナライザー(参照用)を作成しました。共有ライブラリとしてコンパイルされ、必要に応じてロードされます。free
malloc
lib_debug
LD_PRELOAD
このデバッガーはこれまでうまく機能してきました。が呼び出されるたびmalloc
に、メモリモニターシングルトンがスタック上に作成されます。このシングルトンは、終了時にスコープから外れると、解放されていないメモリについて報告します。
ただし、アプリケーションの1つがstd::vector
グローバルスコープでを割り当てます。このグローバルvector
は、ヒープアナライザーが作成される前に作成されており、最も重要なのは後で破棄されているようです。したがって、これにmain
何かを挿入すると、シャットダウン時にメモリリークが発生したと見なされます。vector
lib_debug
説明のために、これは私がイベントのシーケンスであると私が信じているものです:
LD_PRELOAD
からシンボルをロードしますlib_debug
;std::vector
グローバルスコープでスタック上に作成されます。lib_debug
初期化が発生します-malloc
どこかで呼び出され、実際のヒープアナライザシングルトンがスタック上に作成されます。- 入力
main
; std::vector::push_back()
発生し、ヒープにメモリを割り当てます。main
終了します。- ヒープアナライザの
lib_debug
シングルトンがスコープ外になり、vector
メモリが解放されていないことがわかります-エラーが報告されます。 - は
vector
グローバルスコープから外れ、メモリを解放します。 - プログラムが終了します。
LD_PRELOADed
したがって、シングルトンが常に最後に削除されることを保証しfree
、アプリケーションで発生するすべてのシングルをキャッチする方法はありますか?