agent-proxyを使用したコンソールとgdbの同時使用

ICS PandaBoardでkgdb
http://xiangcai.at.webry.info/201203/article_1.html

というブログを書いたのですが、その後@tetsu_kobaさんから
agent-proxyというユーティティを使うとシリアルコンソールとgdb接続を同時に行うことができます。
とコメントをいただきましたのでやってみました。

1、agent-proxyのダウンロードとコンパイル、インストール

(1)ダウンロード
$ git clone git://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git

Initialized empty Git repository in /home/oono/Jtag/agent-proxy/.git/
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 7), reused 0 (delta 0)
Receiving objects: 100% (19/19), 23.16 KiB, done.
Resolving deltas: 100% (7/7), done.

(2)コンパイル
$ cd agent-proxy
$ make
make
gcc -DAGENT_VER=1.95 -g -Wall -Wno-unused-parameter -Dlinux -c agent-proxy.c -o agent-proxy.o
gcc -DAGENT_VER=1.95 -g -Wall -Wno-unused-parameter -Dlinux -c agent-proxy-rs232.c -o agent-proxy-rs232.o
gcc -DAGENT_VER=1.95 -g -Wall -Wno-unused-parameter -Dlinux -o agent-proxy agent-proxy.o agent-proxy-rs232.o

gent-proxyの出来上がり

(3)インストール
$ sudo cp agent-proxy /usr/local/bin

$ which agent-proxy
/usr/local/bin/agent-proxy


2、agent-proxyの実行
$ agent-proxy 4440^4441 0 /dev/ttyUSB0,115200 &
Agent Proxy 1.95 Started with: 4440^4441 0 /dev/ttyUSB0,115200
Agent Proxy running. pid: 2641

コンソールアクセスのためのTelnetのポート番号:4440
gdbアクセスのためのポート番号4441
シリアルポートのデバイスファイル
ボーレート
を指定しています。

https://events.linuxfoundation.org/slides/2010/linuxcon2010_wessel.pdf
のP12のイメージです。

ポート番号は以下にあるように、4440と4441じゃないと上手くいきませんでした。
http://web.me.com/elvis.dowson/Technote/Android_Technotes/Entries/2010/11/27_How_to_setup_adb_over_ethernet_for_debugging_android_applications_using_the_Gumstix_Chestnut43_expansion_board.html

3、Telnetによるコンソール接続
Telnetで4440ポートに接続します。

$ telnet localhost 4440
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
[ 369.644195] binder: release 2303:2303 transaction 22552 out, still active
[ 369.668395] binder: release 2330:2330 transaction 22560 out, still active
[ 369.701812] binder: release 2159:2339 transaction 22552 in, still active
[ 369.716278] binder: send failed reply for transaction 22552, target dead
[ 369.737640] binder: send failed reply for transaction 22560, target dead

root@android:/ #

と表示されて通常のコンソールと同じように操作できます。

4、gdbの接続
$ ddd --debugger arm-eabi-gdb
でDDDを起動します。

(1)デバッグイメージの読み込み
GDB ConsoleでGDBのコマンドが実行出来ます。
(gdb) file vmlinux
を実行してデバッグイメージを読み込みます。
Source Windowにソースが表示されます。
画像


(2)ターゲットへの接続
以前は下記のように指定しました。
(gdb) target remote /dev/ttyUSB0

今回は
(gdb) target remote localhost:4441
になります。

上記のコマンドをDDD上で実行するとコンソールが自動的にKGDBモードになります。
画像


(3)printkにブレークポイントを張る
(gdb) b printk
(gdb) c
でブレークポイントに止まります。
画像


(4)変数の確認やステップ実行
以前と同じように変数の中身をData Windowで確認したり、ステップ実行が可能です。
画像


(5)コンソール
ブレークポイントを削除して
(gdb) c
を実行すれば、コンソール側は開放されて操作が出来るようになります。

画像


これでgdbでブレークポイントを仕掛けて、コンソールで操作(例:カーネル側に操作移るようなシステムコールを発生させるようなもの)してみたいなことが出来ると思います。

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント

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