ℹ️本記事は古いコンテンツを変換して表示しています。
表示が崩れたり、リンクが正しくない可能性があります。ご了承ください。
ℹ️本記事は古いコンテンツを変換して表示しています。
表示が崩れたり、リンクが正しくない可能性があります。ご了承ください。
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.panic
とvm.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
に書いてテストする。
最終的にこっちでも引っかからず、原因不明。困った。