GDB スタブを書いてみよう その2

gdb 7.0 をダウンロードする。

./gdb/m68k-stub.c
./gdb/m32r-stub.c
./gdb/i386-stub.c
./gdb/sparc-stub.c


前回の調査で sparc-stub.c が良くまとまっている事が分かっているので見ていこう。
さっそく GDB コマンドなる物があるらしく説明がある。レジスタやメモリの read/write、resume, stop, kill など。

 * command          function                               Return value
 *
 *    g             return the value of the CPU registers  hex data or ENN
 *    G             set the value of the CPU registers     OK or ENN
 *
 *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
 *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
 *
 *    c             Resume at current address              SNN   ( signal NN)
 *    cAA..AA       Continue at address AA..AA             SNN
 *
 *    s             Step one instruction                   SNN
 *    sAA..AA       Step one instruction from AA..AA       SNN
 *
 *    k             kill
 *
 *    ?             What was the last sigval ?             SNN   (signal NN)
  • コマンドの直後に checksum が置かれる
  • コマンド作成と parse はそのまま流用できそう
  • GDB が理解するのは SIGILL などのシグナル
    • stub が sparc の trap 種別との変換表を保持している

handle_exception

handle_exception が本丸のようだ。sparcアセンブリは分からないので適当に追う。

  • 動作
    • まずホストから情報送信
    • 次にリモートの GDB から1つコマンドが送られてくるので応じる
  • ホスト側からの情報送信
    • exception が起きた事とその種類。
    • pc
    • fp (多分フレームポインタ)
    • sp
  • コマンド
    • '?': signal 種類を返す
    • 'd': debug flag をトグル (sparc 実装は空)
    • 'G': register write
    • 'm': memory read
    • 'c': continue at address
    • 'k': kill the program (sparc 実装は空)
    • 'r': Reset (意味不明)
  • exception が起きたら host にまず知らせる(パケット送信)

sparc の stub は予想より短かった。

i386-stub.c

sparc との差分を見ていこう。ほとんど同じ内容だった。ファイルが public domain であることが明記されていてうれしかった。

保留事項

  • GDB コマンドの ENN とは?
  • reset コマンドとは?
  • kill の実装は空でい良いの?
  • 各 trap ハンドラで hook してるけど、例えば page fault handler では処理前と処理後の状態どちらで呼べば良いんだろう。

次の一手

具体的な OS 上で動いている stub を見る事とする。良いサンプルを見つけよう。