* 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 起動の説明を変更. - vmlinux の説明がミスリーディングぽかったらしいので,gdb 起動の説明を変更. - カーネルコンフィグオプションの説明が間違ってたので修正 [http://www.oidon.net/ koyo_take] さん,ご指摘ありがとうございました.