* kgdb を使ってみた - テキスト版 [#q2dd6d2d]

#nicovideo(sm6890424,right)

先日,ニコ動にこんな動画を投稿してみたんだけど,「文字が読みにくい」という意見が多かったので,テキストに起こしてみました.
#clear

** kgdb とは [#ece73bfd]
#ref(1.png,right,around,50%)
ターゲットプログラム内に''スタブ''と呼ばれる gdb の手先を組み込み,別のマシンで gdb を起動しデバッグを行う方法は,ワンチップマイコンのプログラム開発なんかで使われています.
この「ターゲットプログラム」が Linux カーネルの場合,「スタブ」に相当するものが kgdb です.
#clear

#ref(HDL-GXR.jpg,right,around,50%)
kgdb は x86 ターゲットでも利用できますが,それではつまらないので,今回はターゲットとして ARM マシンである I-O DATA LANDISK HDL-GXR を使ってみました.
#clear

** menuconfig [#w5803b12]

まずはビルドするカーネルの設定.

#ref(menuconfig-1.png,right,around,70%)
トップメニューから「Kernnel hacking」メニューに入って
#clear

#ref(menuconfig-2.png,right,around,70%)
「Compile the kernel with debug info」を有効にします.
これが無くても kgdb 自体は動作するんだけど,vmlinux ファイルにデバッグ情報が埋め込まれなくなるので gdb 上でソースコードが参照できなくなってしまいます.
#clear

#ref(menuconfig-3.png,right,around,70%)
もちろん KGDB オプションも有効にします.
#clear

#ref(menuconfig-4.png,right,around,70%)
KGDB メニューに入り,「KGDB: use kgdb over the serial console」オプションも有効にします.
#clear

** カーネルコマンドライン [#q5725f81]

#ref(u-boot.png,right,around,70%)

kgdb を利用するには,カーネルコマンドラインに

>kgdboc=ttyS0,115200

という設定を追加して起動します.

x86 マシンの場合は grub や lilo でこの操作をやりますが,HDL-GXR では u-boot でこの操作を行います.

あと,

>console=ttyS0,115200

というパラメータも追加し,シリアルにコンソールを設定してやります.
でないと,リモートマシンと通信をすることができません.
#clear

** kgdb への切り替え [#b40ae0a3]
#ref(sysrq.png,right,around,70%)
シリアルコンソールを gdb スタブへ明け渡すには

> ブレーク信号 g

を送ってやります.

ブレーク信号(Ctrl+C とは別物)の送り方は,使っているターミナルソフトの説明を読んでください.
ここで使っている minicom の場合は

> Ctrl+a f

でブレーク信号が送出されます.

この後に続けて「g」を入力すると,シリアルコンソールが gdb スタブへと切り替わります.

** gdb の起動 [#ce85f3d9]

#ref(gdb-start.png,right,around,70%)

ターミナルソフトを終了させて gdb を起動します.

> arm-linux-gnueabi-gdb vmlinux -b 115200

gdb のコマンドラインには uImage や bzImage ではなくて,デバッグ情報が格納されている,カーネルソースツリー直下の vmlinux ファイルを指定します.
あと,-b 115200 はシリアルのビットレートです.

で,gdb プロンプトで

> target remote /dev/ttyS0

と入力すると kgdb と接続されます.
#clear

#ref(gdb-bt.png,right,around,70%)
あとは,アプリケーションプログラムのデバッグのときと同様にバックトレースを取ったり
#clear

#ref(gdb-bp.png,right,around,70%)
ブレークポイントを設定したり
#clear

#ref(gdb-step.png,right,around,70%)
ステップ実行したり,変数を参照したりすることもできます.

#clear

** まとめ [#ac38ed8a]

ざっくりと kgdb を起動するまでを説明しました.

デバッガとは本来,デバッグするための道具です.
が,不具合が無い場合でも,単にプログラムの動作を追ってみたり,プログラムの流れを学習したりするのにも使えます.
というわけで,kgdb は「Linux のカーネルのソースコードは巨大すぎて,どこから見ていけばいいかわからない」という向きにもオススメできるのかもしれません.

** 2009/12/17 追記 [#h2361432]
- vmlinux の説明がミスリーディングぽかったらしいので,gdb 起動の説明を変更.
- カーネルコンフィグオプションの説明が間違ってたので修正

[http://www.oidon.net/ koyo_take] さん,ご指摘ありがとうございました.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS