Next: , Previous: Debug Session, Up: Remote Serial


13.4.1.4 通信プロトコル

GDBとともに提供されるスタブ・ファイルは、 ターゲット側の通信プロトコルを実装します。 そしてGDB側の通信プロトコルは、 GDBのソース・ファイルremote.cに実装されています。 通常は、 これらのサブルーチンに通信処理を任せて、 詳細を無視することができます (独自のスタブ・ファイルを作成するときでも、 詳細については無視して、 既存のスタブ・ファイルをもとにして作成を始めることができます。 sparc-stub.cが最もよく整理されており、 したがって最も読みやすくなっています)。

しかし、 場合によっては、 プロトコルについて何かを知る必要が出てくることもあるでしょう。 例えば、 ターゲット・マシンにシリアル・ポートが1つしかなく、 GDBに対して送られてきたパケットを検出したときに、 ユーザ・プログラムが何か特別なことをするようにしたい場合です。

(単一文字による確認メッセージを除く) すべてのGDBコマンドとそれに対する応答は、 チェックサムを含むパケットとして送信されます。 パケットは、 文字‘$’で始まり、 文字‘#’に2桁のチェックサム値が続いて終わります。

     $packet info#checksum

ここで、 checksumpacket infoのすべての文字の値を合計したものを256で割った余りとして計算されます。

ホスト・マシンまたはターゲット・マシンがパケットを受信したとき、 最初に期待される応答は確認メッセージです。 これは単一文字で、 (パッケージが正しく受信されたことを示す) ‘+’または (再送要求を示す) ‘-’です。

ホスト (GDB) がコマンドを送信し、 ターゲット (ユーザ・プログラムに組み込まれたデバッグ・スタブ) が応答としてデータを送信します。 ターゲットは、ユーザ・プログラムが停止したときにも、 データを送信します。

コマンド・パケットは最初の文字で区別されます。 最初の文字がコマンドの種類を表わします。

以下に、 現在サポートされているコマンドをいくつか列挙します (コマンドの完全なリストについてはgdb/remote.cを参照してください)。

g
CPUレジスタの値を要求します。
G
CPUレジスタの値を設定します。
maddr,count
addrで示される位置からcountで示されるバイト数を読み込みます。
Maddr,count:...
addrで示される位置からcountで示されるバイト数を書き込みます。
c
caddr
カレントなアドレス (addrが指定されているのであれば、 それによって指定されるアドレスから) 実行を再開します。
s
saddr
プログラム・カウンタの指すカレントな箇所から (addrが指定されているのであれば、 それによって指定されるアドレスから) ターゲット・プログラムを1命令だけステップ実行します。
k
ターゲット・プログラムを終了させます。
?
最後に受信したシグナルを報告します。 GDBのシグナル処理コマンドを利用できるように、 デバッグ・スタブの中のある関数が、 CPUトラップを対応するPOSIXシグナル値として報告してきます。
T
リモートのスタブに対して、 GDBがシングル・ステップ処理や条件付きブレイクポイントに関する迅速な決定を下すのに必要となる レジスタの情報だけを送信するようにさせます。 これによって、 ステップ実行中の1命令ごとにすべてのレジスタの情報を入手する必要がなくなります。

現在のGDBは、 レジスタへのライト・スルー・キャッシュを実装していて、 ターゲットが実行された場合のみ、 レジスタを再度読み込みます。

シリアル接続に問題がある場合には、 set remotedebugコマンドを使うことができます。 これによりGDBは、 シリアル回線経由でリモート・マシンとの間で送受信したすべてのパケットを報告するようになります。 パケット・デバッグ用の情報はGDBの標準出力ストリームに表示されます。 set remotedebug offによってこの設定が解除され、 show remotedebugによって現在の設定が表示されます。