シリアル接続されたPPCターゲットのリモートデバッグスタブ(gdbserverもどき)
の使い方などをまとめてみました。ターゲットが本物PPCなのでイマイチ遊べる人が
少ないと思うのですが、そんときは単なる読み物として楽しんでください
(<楽しめるのか?)。
gdbの日本語ドキュメントとして、
KI's Unofficial GNU Manual Translation Project
を大いに参考にさせていただきました(GDBのページからもリンクされていて、
ほとんどofficialのような感じです)。こちらの方も合わせて参照して
いたくと、より何かが(???)深まるかも知れません。
リモートデバッグ時のハードウェア接続関係は以下のような感じになります。

適当なサイトからgdbのソースをダウンロードします。私はCygwin上でbuild
しましたが、UNIX系OSなら特に問題なくbuildできると思います。
以下のような感じでbuildします。
./configure --target=powerpc-unknown-elf makeこれで PowerPCをターゲットとした gdb/gdb が生成されます。
サーバは大きく分けて以下のようなパートで構成してみました。
vec0d00:
/** Trace Exception **/
stmw %r0,0x80(%r0)
xor %r3,%r3,%r3
oris %r3,%r3,0x0d00 /** ←ここ **/
b __save_regs
のように、(ベクタアドレス / 0x100) の値を%r3の上位1byteに残しておくことで
例外ハンドラ内に、どのような例外でブランチしてきたかが判るようにして
みました。これはプロトコル解釈パート(void handle_exception (int exceptionVector))
の引き数に与えて、handle_exception内でsys/signal.hで定義されるような
シグナルに置きかえる処理を行っています。void init_serial() /*シリアルポートの初期化*/ char getDebugChar(void) /*1文字受信 */ void putDebugChar(char c) /*1文字送信 */の三つのサブルーチンを作成すればOKです。
xor %r8,%r8,%r8
oris %r8,%r8,stepping@ha
ori %r8,%r8,stepping@l
lwz %r9,0(%r8)
cmpwi %r9,0
beq __not_step
mfsrr1 %r0
ori %r0,%r0,0x0400 /** set SE **/
mtsrr1 %r0
b __esc1
__not_step:
mfsrr1 %r0
andi. %r0,%r0,0xfbff /** reset SE **/
mtsrr1 %r0
__esc1:
/*-----レジスタの復帰-----*/
rfi
ターゲットボードへのロードと実行はそれぞれのボードで提供される方法
で行います。Windowsでターミナルソフトを使用して実行する場合、
即プロトコル受付け状態になるので、そのまま接続を切ります。
続いてgdbを起動します。bpsを指定する場合は--baudオプションを使用します。
gdb --baud 38400
(gdb) target remote com2 Remote debugging using com2 0x201c80 in ?? ()これで停止状態になっています(^^;
(gdb) load test Loading section .text, size 0x2f64 lma 0x10000 Loading section .rodata, size 0x8 lma 0x12f64 Loading section .data, size 0x7d0 lma 0x22f70 Loading section .sdata, size 0x18 lma 0x23740 Start address 0x10000 , load size 14164 Transfer rate: 14164 bits/sec, 372 bytes/write(14kbpsしか出ていないのがいまいちですが(^^;それはさておき)
(gdb) file test A program is being debugged already. Kill it? (y or n) y Reading symbols from test...done.これで普通にリストコマンドなどを使用できます。
(gdb) target remote com2 Remote debugging using com2 0x10000 in _start ()ここでレジスタの内容を確認します。
(gdb) info registers r1 pc r1 0x2203f8 2229240 pc 0x10000 65536r1はスタックポインタとして使用されるのですが、この内容はgdbserver内の スタック領域を指しているため、適当に変えた方が良いと思われます。 本来ここらへんはプログラムロード時にOSが設定する部分です。
基本的な動作を行う事に特化しているため、
2001.05.06 : 初版