kanejaku.org

Chromeのメモリ割り当てフック機構

29 Sep 2018

Misreading Chat ep. 30はAddressSanitizer (ASAN)の話。operator newの差し替えとかどうしているんだろうね、という話題に反応してみる。

Chromeのコードにもoperator newを差し替えている場所はいくつかある。例えばUSING_FAST_MALLOCというマクロでアノテートされたクラスはPartitionAllocという独自アロケータを使ってoperator newを実装している。このPartitionAlloc、レンダリングエンジンの内部では結構使っていて文字列やベクタ、ArrayBufferなんかにも使われている。PartitionAllocは内部でmmap使っているんだけど、ASANがこの辺をチェックしてくれるのかどうか自分はよくわかっていない。

mallocとかを差し替えたい動機としては、PartitionAllocみたいな最適化したメモリアロケータを使いたい、っていうのの他に、メモリの割り当てと解放をフックしたい、というのがある。これらをフックすればどういう風にメモリが使われているのかを調べることができる。例えば、よく作られるオブジェクト(Stringとか)の一部がすごく大きいのだけど、どこで作られているのか実行時でないと分からないとする。この場合はそのオブジェクトのnewをフックしてスタックトレースを調べれば、どういうパスを通ってそのオブジェクトが作られたのかが分かる。

Chromeにはこのフックを入れる汎用的な仕組みがあって、Allocator shimと呼ばれている。この仕組を使ってヒーププロファイラメモリトレースの機能が実装されている。Allocator shimはmallocoperator newを差し替えるので、ASANと共存することは残念ながらできない。

というわけで、ASANをネタにChromeのAllocator shimの紹介をしてみた。このあたりはドキュメントが充実しているので読んでみると面白いかもしれない。