りんけーじ - blog

ℹ️本記事は古いコンテンツを変換して表示しています。

表示が崩れたり、リンクが正しくない可能性があります。ご了承ください。

2017/01/15 01:01 : RedZone/memguardでカーネルデバッグ

モジュールをいじってたらkernel: Fatal double faultでpanicするようになってしまったので調査。とはいってもdouble faultの原因リストなんて知らないので、ここはメモリ破壊系バグによる誤動作に賭けて調査開始。

モジュールをいじってたらkernel: Fatal double faultでpanicするようになってしまったので調査。とはいってもdouble faultの原因リストなんて知らないので、ここはメモリ破壊系バグによる誤動作に賭けて調査開始。

……といっても、これまた調査方法を知らない。ユーザランドならvalgrindなどの強力なツールがあるけど、kernelだとどうなのか。まずたどり着いたのはRedZone。

redzone (FreeBSD Man Pages)

カーネルのビルド設定に、options DEBUG_REDZONEを加えてあげればよい模様。あとは動作としてsysctlでvm.redzone.panicvm.redzone.extra_memが設定可能。前者は見たまま(default: off)、後者は検出用の領域サイズであろうか。(※1)

※1 vm.redzone.extra_memはデフォルトが記されていないが、テスト環境では7206336(7.2MBくらい)だった。当初想定した"mallocした領域の前後につける緩衝領域"とは少し違うのかもしれない。まあ、ページサイズより大きい分には空の仮想メモリを割り当てればいいから、MB単位だとどうでもいいのかもしれないが。

さて、これでダメだったので、次はmemguardを使ってみる。

memguard(9) (FreeBSD Man Pages)

同じくoptions DEBUG_MEMGUARDを入れてやる。こっちはuma_zallocで確保した領域もチェックしてくれるらしい。今回はnamei_zoneが怪しいので対象にしてみる。namei zoneは使うときにnamei_zoneと指定するので、その初期化を探して、/usr/src/sys/kern/vfs_lookup.c:

namei_zone = uma_zcreate("NAMEI", MAXPATHLEN, 

から、名前は"NAMEI"と分かるので、sysctl -w vm.memguard.desc=NAMEIと指定する。いきなり起動時に指定してbootできなくなると困るけど、後から指定するとチェックしてくれない領域が生じるので、一回sysctlで書き換えてテストしてから、/boot/loader.confに書いてテストする。

最終的にこっちでも引っかからず、原因不明。困った。