ICS PandaBoardでkgdb

カーネルを理解するのに、最近は色々な書籍があるし、何よりソースがあるから、頑張るだけなんですが
さすがに最初から全部を見るのは厳しいし、実際に動いてるのを見た方が分かり易いし、デバッグも出来る。

ということで、Linux カーネル デバッグ
あたりでググると、kgdbでアプリと同じような感覚でデバッグ出来るらしいというのが分かりました。
せっかくなので、Android ICS PandaBoardでやってみました。

ICS PandaBoardの構築詳細はここでは割愛します。

構築が出来ているという前提でkgdbを有効にする方法を以下に示します。
以下を参考にさせていただきました。

kgdb を使ってみた - テキスト版
http://jr0bak.homelinux.net/~imai/pukiwiki/pukiwiki.php?%C6%FC%B5%AD%2F2009-05-02%2Fkgdb%20%A4%F2%BB%C8%A4%C3%A4%C6%A4%DF%A4%BF%20-%20%A5%C6%A5%AD%A5%B9%A5%C8%C8%C7

ニコ動でも公開されています。
http://www.nicovideo.jp/watch/sm6890424

1、クロスコンパイル用の環境変数の設定
環境変数を設定します。ツールチェインはAndroidをダウンロードした配下のprebuildを使用しています。

export ANDROID_ROOT=$PWD
export ARCH=arm
export CROSS_COMPILE=$ANDROID_ROOT/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

2、Kernelファイルのダウンロード
3.0のカーネルをダウンロードします。

$ mkdir kernel
$ cd kernel/
$ git clone https://android.googlesource.com/kernel/omap
$ cd omap
$ git checkout -b android-omap-panda-3.0 origin/android-omap-panda-3.0

3、Configファイルの作成
$ make panda_defconfig

カレントディレクトリに.configファイルが作成されます。
通常ですと、ここでMakeして終わりですが、kgdbを有効にするために以下の作業を行います。

4、kgdbを有効にする

$ make menuconfig

(1)メニュー画面が表示される
画像


(2)カーソルを下に進める
Kernel hackingの中に入る
画像


(3)Compile the kernel with debug infoを有効に
Kernel hackingを下に進むと「Compile the kernel with debug info」があるので有効にします。
デフォルトで有効になっていました。もし、無効であればスペースキーを押下して有効にします。
画像


(4)KGDB: kernel degugger
さらに下へ進むと「KGDB: kernel degugger」があります。
画像


(5)KGDB: kernel degugger選択
有効になっていないので、スペースキーを押下します。
画像


(6)サブメニューへ降りる
有効にした後でサブメニューへ降ります。以下を有効にします。
KGDB: user kgdb over the serial console (NEW)
KGDB_KDB: include kdb frontend for kgdb(NEW)
→(訂正)これはいらないようです。入れるとうまくデバッグ出来ませんでした。

画像


(7)設定の保存
階層を上がって行きます。設定を保存するのか聞いてくるのでを選択して終了します。
画像


5、Kernelをビルドする
kgdbを有効にしたカーネルをビルドします。

$ make uImage modules -j8

6、SDカードに保存
ビルドしたカーネル:uImageをSDカードのブート領域に保存します。

7、kgdbを使用するためのカーネルパラメータ
ブートローダがカーネルに渡すカーネルパラメータにkgdbocを追加します。
kgdboc=[シリアルデバイスファイル],[ボーレート]
という形式で指定します。
PandaBoardだと
kgdboc=ttyO2,115200
になります。

8、SDカードを挿して電源ON
ブートしたら、自動起動する前にエンターキーを押して止めます。

kgdboc=ttyO2,115200を追加してカーネルパラメータを設定してブートします。

setenv bootargs 'kgdboc=ttyO2,115200 console=ttyO2,115200n8 mem=1G androidboot.console=ttyO2 console=ttyO2,115200n8 mem=512M root=/dev/mmcblk0p3 rw rootdelay=2 init=/init vram=32M omapfb.vram=0:16M androidboot.console=ttyO2'

setenv bootcmd 'mmcinit 0;fatload mmc 0 0x80000000 uImage; bootm 0x80000000'

boot

9、kgdbモードへの移行
起動してログイン出来たら、kgdbモードへの移行します。
シリアルコンソールを gdb スタブへ明け渡すには
ブレーク信号 g
です。
使っているコンソールによって異なります。TeraTermとminicomの例を以下に示します。

(1)TeraTerm
メニューのコントロール→ブレーク送信を選択してから、gを押すと以下のように切り替わります。
画像


(2)minicom
Ctrl+a f
でブレーク信号が送出されます.

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

画像


どちらの場合でもEntering KGDBtと表示されてスタブへ切り替わります。

とりあえずここまでで、ターゲットボード側の設定は終わりました。

母艦のPC側からgdbで接続すればまずはターミナル上でのデバッグが出来るはずです。

今日はここまで

続きはこちら(DDDを使った接続)
http://xiangcai.at.webry.info/201203/article_2.html





ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

tetsu_koba
2012年03月21日 22:33
agent-proxyというユーティティを使うとシリアルコンソールとgdb接続を同時に行うことができます。
"kgdb agent-proxy"で検索。
pakuqi
2012年03月22日 00:06
tetsu_kobaさん
kgdb agent-proxyなんてあるんですね。
ありがとうございます。
これでシリアルコンソールとgdb接続が同時に使えます

この記事へのトラックバック