カーネルが予想もしない時にコアダンプして config -g
を行ってコンパイルされていなかった場合にはどうしたらよいでしょう.
すべてが失われるわけではありません. パニックを起こさないでください.
もちろん, クラッシュダンプを使えるようにする必要があります. 使い方は前述の部分を見てください.
カーネルのコンパイルディレクトリで, (Makefileの)
COPTFLAGS?=-O
とある行を編集します. -g
オプショ
ンをここに加えます(オプティマイズオプションのレベルは 変更しな
いでください ). もし大まかにコードのどこで問題が起きているか (例
えば, 上の例では pcvt
ドライバ) わかっているのでしたら, その部
分のコードについてのすべてのオブジェクトファイルを消してください. カーネ
ルを再構築しましょう. Makefileのタイムスタンプの変更により, 例えば
trap.o
などのいくつかの他のオブジェクトファイルも作り直さ
れます. 少しの幸運があれば, -g
オプションが追加されても作ら
れるコードは変更されず, いくらかのデバッグシンボル以外には問題を
起こしたコードとそっくりな新しいカーネルを手に入れることができます.
少なくとも size
コマンドで古い方と新しい方のサイズを比較すべ
きです. これが食い違っていれば, 多分あきらめなければならないでしょう.
ダンプを使って前述のように動かして調べます. デバッグシンボルは
必ずしも十分ではありません. 上の例ではスタックトレースでいくつかの関
数の行番号や引数リストが表示されないかもしれません. もしより多くのデ
バッグシンボルが必要であれば,十分になるまで適切なオブジェクトファイ
ルを消して (makeして) kgdb
セッションを繰り返してください.
これは必ずしもうまく動くと保証はできません. しかしほとんどの場合でう まくいくでしょう.