カーネルデバッグに手を染めてみる(1)

もたもたしてたらFreeBSD 11.0-BETA2が出てしまった。
この前から続けて、最後に試したFreeBSD 11.0-BETA1なシステムでiSCSI+zfsがハマる原因を調べる。
(一応書いておくと、9.3-RELEASE, 10.1-RELEASE, 10.3-RELEASEのいずれでも発生している。)

参考資料

  1. カーネルをビルドする。
    # cd /usr/src
    # cp sys/amd64/conf/GENERIC sys/amd64/conf/DEBUG
    # emacs sys/amd64/conf/DEBUG
    <ここでoptions DDBを追加>
    # make kernel-toolchain
    # make buildkernel KERNCONF=DEBUG
    # make installkernel KERNCONF=DEBUG
    # reboot
    

    /usr/srcにソースがない人はftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/amd64/11.0-BETA1/src.txzあたりから持ってくる。持ってくるときはカーネルのバージョンに気をつけないとひどい目に遭う。(遭った。)

  2. デバッガに入れるか確認する。sysctlでenterしてみる。
    # sysctl debug.kdb.enter=1

    ここでdebug.kdb.enter: 0 -> 0と出る場合はカーネルが正しくビルド、もしくはインストールできていない。
    無事にddbに入れたらcontで脱出。

  3. シリアルケーブルをつなぐ。
    テスト用機(デバッグされる側)と適当なマシン(デバッグ作業をする側)をシリアルケーブルでつなぐ。
    接続できたかはcuでチェックする。
    双方でcu -l /dev/cuau0を実行して、あとは適当にキーを叩いて他方に出ればOK。
  4. /boot.config/boot/loader.confを書く。後者はいらないかも。
    /boot.config:

    -h

    /boot/loader.conf:

    hint.uart.0.flags="0x90"
  5. これで、通常は画面に出るメッセージの類がすべてシリアルコンソールに向いた。

  6. デバッグ作業マシンでcuを叩いておいて、テスト用機を再起動する。
    無事に起動時のメッセージが見えればOK。出ないときは……知らない。

  7. デバッグ作業マシンからデバッガに入る。cu越しに叩いてみる。
    # sysctl debug.kdb.enter=1

    無事にローカル上での実行と同じようにddbのコンソールに移ればOK。途中で途切れたりキー入力を受け付けない場合は、きっと/boot/loader.confの設定あたりが怪しい。うまくいったらcontで脱出。

  8. 長くなったので次に続く。