次: Server, 前: Debug Session, 上: Remote Serial
GDBとともに提供されるスタブ・ファイルは、 ターゲット側の通信プロトコルを実装します。 そしてGDB側の通信プロトコルは、 GDBのソース・ファイルremote.cに実装されています。 通常は、 これらのサブルーチンに通信処理を任せて、 詳細を無視することができます (独自のスタブ・ファイルを作成するときでも、 詳細については無視して、 既存のスタブ・ファイルをもとにして作成を始めることができます。 sparc-stub.cが最もよく整理されており、 したがって最も読みやすくなっています)。
しかし、 場合によっては、 プロトコルについて何かを知る必要が出てくることもあるでしょう。 例えば、 ターゲット・マシンにシリアル・ポートが1つしかなく、 GDBに対して送られてきたパケットを検出したときに、 ユーザ・プログラムが何か特別なことをするようにしたい場合です。
(単一文字による確認メッセージを除く) すべてのGDBコマンドとそれに対する応答は、 チェックサムを含むパケットとして送信されます。 パケットは、 文字`$'で始まり、 文字`#'に2桁のチェックサム値が続いて終わります。
$packet info#checksum
ここで、 checksumはpacket infoのすべての文字の値を合計したものを256で割った余りとして計算されます。
ホスト・マシンまたはターゲット・マシンがパケットを受信したとき、 最初に期待される応答は確認メッセージです。 これは単一文字で、 (パッケージが正しく受信されたことを示す) `+'または (再送要求を示す) `-'です。
ホスト (GDB) がコマンドを送信し、 ターゲット (ユーザ・プログラムに組み込まれたデバッグ・スタブ) が応答としてデータを送信します。 ターゲットは、ユーザ・プログラムが停止したときにも、 データを送信します。
コマンド・パケットは最初の文字で区別されます。 最初の文字がコマンドの種類を表わします。
以下に、 現在サポートされているコマンドをいくつか列挙します (コマンドの完全なリストについてはgdb/remote.cを参照してください)。
g
G
m
addr,
countM
addr,
count:...
c
c
addrs
s
addrk
?
T
現在のGDBは、 レジスタへのライト・スルー・キャッシュを実装していて、 ターゲットが実行された場合のみ、 レジスタを再度読み込みます。
シリアル接続に問題がある場合には、
set remotedebug
コマンドを使うことができます。
これによりGDBは、
シリアル回線経由でリモート・マシンとの間で送受信したすべてのパケットを報告するようになります。
パケット・デバッグ用の情報はGDBの標準出力ストリームに表示されます。
set remotedebug off
によってこの設定が解除され、
show remotedebug
によって現在の設定が表示されます。