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