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はmalloc
とoperator new
を差し替えるので、ASANと共存することは残念ながらできない。
というわけで、ASANをネタにChromeのAllocator shimの紹介をしてみた。このあたりはドキュメントが充実しているので読んでみると面白いかもしれない。