mallocとfreeフックを使用して、アプリケーションでのmallocとfreeの使用を監視したいと思います。
これがドキュメントですhttp://www.gnu.org/s/libc/manual/html_node/Hooks-for-Malloc.html
my_malloc_hook
サンプルページから、mallocを再度呼び出す前に、mallocフックを一時的にオフ(またはチェーン内の前のフック)に切り替えることがわかります。
これは、マルチスレッドアプリケーションを監視する場合の問題です(説明については、質問の最後を参照してください)。
私がインターネットで見つけたmallocフックの使用の他の例にも同じ問題があります。
マルチスレッドアプリケーションで正しく機能するようにこの関数を書き直す方法はありますか?
たとえば、mallocフックが呼び出すことができる内部libc関数があり、フックを非アクティブ化する必要なしに、割り当てを完了します。
会社法上の理由でlibcのソースコードを見ることができないので、答えは明らかかもしれません。
私の設計仕様では、mallocを別のmalloc設計に置き換えることはできません。
他のフックは機能していないと推測できます。
アップデート
mallocのサービス中にmallocフックが一時的に削除されるため、別のスレッドがmallocを呼び出し、フックを取得できない場合があります。
これが起こらないようにmallocの周りに大きなロックがあることが示唆されていますが、それは文書化されていません。また、mallocを効果的に再帰的に呼び出すという事実は、フックの後にロックが存在するか、または愉快に賢くなければならないことを示唆しています。
caller ->
malloc ->
malloc-hook (disables hook) ->
malloc -> # possible hazard starts here
malloc_internals
malloc <-
malloc-hook (enables hook) <-
malloc
caller