ホーム 研究内容 FreeBSD HP電卓 今日のgoo Links

--ホーム--
研究内容
FreeBSD
HP電卓
--Links--
BSD
Security
Hardware
NetHack
HP電卓

kgdbを使った検死

FreeBSD(98)の検死を行なう場合,もっとも強力な道具はkgdbです.カーネル がお亡くなりになったときはこれを使ってデバッグするのが極めて有効です. では,その使い方を説明していきます.

カーネルの構築

通常のカーネルの構築作業でも検死を行なえないことはないのですが,やはり デバッグ用のカーネルを用意した方が幸せです.ソースリストや変数名を知る ことができるのとできないのでは雲泥の差があります.デバッグ用のカーネル の作り方はいたって簡単です.

	config -g CONFIGFILE

と実行することだけです.``-g''が加わっただけですね.こうしてから,

	cd ../../compile/CONFIGFILE
	make depend all

と実行するとカーネルが作成されます.ところが,作成されたカーネルにはシ ンボルテーブルがどっさり詰め込まれているので,

  1. loading kernelが表示された後めちゃくちゃ待たされる
  2. rearanging symbolが表示された後めちゃくちゃ待たされる
  3. できあがったkernelはめちゃくちゃでかい

ということになります.kernelのでかさはすごくて,私のところでは9.7MBに なります.こんなカーネルをインストールしたら洒落にならないわけで,ちょっ としたおまじないを行ないます.

	cp kernel kernel.debug
	strip -d kernel
	make install

シンボルテーブルつきのでかいkernelは名前を変えて保存しておき,実際にイ ンストールするカーネルはストリップしておきます.

パニック後の処置

カーネルの準備ができたら後はパニックするのを待つだけです.運良く(?)パ ニックしてくれたら様子を見てあげましょう.そのうちdumping coreと言って からハードディスクに実メモリの内容を転送していきます.終了するとそのう ちリブートします.さて,リブートしたら今度はカーネルを立ちあげます.こ のとき,

	Boot: kernel -s

のようにしてシングルユーザモードで起動します.もしpanicが頻繁で使い物 にならないカーネルであれば,kernelの変わりに安定したカーネルの名前を入 れて下さい.(私はいつもkernel.okというのを用意しています.)
シングルユーザモードで起動したらまず,

	fsck -p

としてファイルシステムを検査して下さい.そして,

	mount -a -t ufs

としてufsのファイルシステムをマウントします.その後で

	savecore -N /kernel /var/crash

と実行して下さい.-Nの後はパニックを起こしたカーネルのファイル名です. savecoreは/var/crashにkernel.0とvmcore.0というファイルを作成します.も し以前にsavecoreを実行していれば,ピリオドの後の数字は大きくなります. ここで注意しなければならないのが,vmcoreのサイズです.これは実メモリの 容量と同じ大きさになります.ファイルシステムを溢れさせないように注意し て下さい.
コアをファイルにしたら

	exit

を実行してマルチユーザモードに移行します.

kgdbを使う

まずログインします.そして,カーネルをコンパイルしたディレクトリに移動 してkgdbを起動します.

	cd /sys/compile/CONFIGFILE
	kgdb

次に,シンボルテーブル,コアダンプ,そして実行ファイルをロードします.

	(kgdb) symbol-file kernel.debug
	(kgdb) exec-file /var/crash/kernel.0
	(kgdb) core-file /var/crash/vmcore.0

これで準備ができました.

	(kgdb) where

を実行するとスタックフレームから後ろにたどった情報が表示されます.kgdb の実態はgdbなので,あとはgdbと同じ要領でデバッグして下さい.

死亡例

実際に死亡したカーネルのデバッグ例を示します.


リーガル Contact 名大岩鉱 名大地球 名大年測
© Copyright KATO Takenori, 1997, 1998, 199, 2000. All rights reserved.
© Original BSD Daemon Copyright 1988 by Marchall Kirk McKusik. All Rights Reserved.