第2章
GDBの使い方からGDBスタブの移植の基本まで

GDBによるクロス・デバッグ環境の構築
プログラムのミスを見つけるためにはデバッガが必要になる．また，シリアル・ケーブルを使ってホストとターゲットを接続する場合，ターゲットにGDBスタブが必要になる．本
稿ではGDBの使い方や，リモート・シリアル・プロトコルについて，さらにCPUに依存しない部分のGDBスタブの動作（編集部）についても解説する．

山際 伸一

第 1 章の解説で，ターゲット CPU で動作するプログラ

JTAG のようなハードウェアで実装されたり，ROM モニムを作成する環境は整いました．しかし，書いたプログラタとしてターゲット CPU が実行している場合もあります．

ムがバグもなく一発で動作することはまずないでしょう．

この通信プロトコルが CPU ごとに異なると，CPU ごとにまた，プログラムの挙動がどうも思い通りにならない，とGDB の最下位ルーチンの通信手順を作成しなければならいうこともあると思います．そのような場合，手軽にプロず，多大な労力が必要となります．そこで GDB には，リグラムの実行とデバッグを可能にするのが GNU ツールにモート・シリアル・プロトコルと呼ばれる通信プロトコル含まれるデバッガの GDB です．

が定義されています．ターゲット・マシンがこの通信プロ

本稿では GDB を使った組み込みプログラムの実行環境を構築し，これを利用するための基本事項を解説します．

トコルに従う限り，GDB はどのような CPU とも会話できるようになります．
通信ケーブルについても，たとえターゲット CPU がさらにアーキテクチャに依存しない部分のターゲット CPU側の ROM モニタの作成方法についても触れます．

JTAG ポートを持っているとしても，その JTAG コマンドはベンダの未公開のものが多く，GDB のサポートは困難

1．GDB によるデバッグ環境とはです（仕様が公開されている ARM プロセッサの JTAG ポートなどについては，オープン・ソースの JTAG 制御ソフト

まずは GDB によるプログラム実行環境を構築する上でウェアも存在するが…）．従って，RS-232-C のシリアル・の基本事項を押さえましょう．

ケーブルで接続された通信方法を用いるのが，GDB では● GDB を使ったデバッグ環境の仕組み当然の選択となっています．

GDB は，CPU に依存しないプログラム・デバッグ環境を作ろうという目標を掲げて作成されたデバッガ・ソフトウェアです．従って，階層化されたプログラム・ソースのターゲット・マシンでGDBスタブを動作させる

最下層に位置する命令ニーモニックの定義や通信手段，通信プロトコルを変更するとどのような CPU にも対応できるようになっています．
GDB はホスト・マシンの通信ポートを介して接続されたターゲット・マシンと通信することでプログラムのダウ（ホスト・マシン
GDBでターゲットプロセッサと通信する

ンロード，実行，停止を可能とします．ターゲット・マシ

Dec. 2007

シリアル・ケーブル（

ンはホスト・マシンと通信するために決められたプロトコルを解釈できなければなりません．この通信プロトコルは）ターゲット・マシン
リモート・シリアル・プロトコルで通信する）

図 1 GDB ＋ GDB スタブによるリモート・デバッグ環境

KEYWORD ―― デバッガ，GDB，リモート・シリアル・プロトコル，GDB スタブ，例外ハンドラ，ROM 化，
スタートアップ・ルーチン，リンカ・スクリプト65

表 1 パケットに用いられるコマンド一覧!

拡張モード?
a

ラスト・シグナル
予約プログラムの引き数をセットする（予約）Aarglen,argnum,arg,...
caddr

コンティニュ

Csig;addr

コンティニュ
（シグナル付き）

D

デタッチ

e，E，f

予約
F パケット・ターゲットへの返答

FRC,EE,CF;XXg

レジスタの読み出し

GXX...
n

レジスタへの書き込み
予約

Hct...

スレッドへのコマンド送信

j，J
k
K，l，L

予約
リクエストを消す
予約

maddr,length

メモリの読み出し

Maddr,length:XX...

メモリへの書き込み

n，N，o，O
Pn=r

予約
レジスタ書き込み（個別）

コマンド解釈モードを拡張モードに変更する．一度拡張モードになると，ノーマル・モードに変更できない．デバッグ対象のプログラムを再起動するには R パケットを使う．
返答： OK リモート・ターゲットを拡張モードに変更完了
ターゲットの中止の理由を表示する．返答はステップ，コンティニュと同じ将来使用するための予約初期化された argv[ ]をプログラムの中に渡す．arglen は arg のバイト数を 16 進数で指定する．詳細は，gdbserver のマニュアルを参照
addr は再開するためのアドレス．addr を省略すると，現在の実行アドレスから再開する．
返答：停止返答パケットの表を参照
シグナル sig は 16 進数．addr を省略すると，現在の実行アドレスから再開する．
返答：停止返答パケットの表を参照
GDB をリモート・システムから切り離す．デタッチ・コマンドを通じて GDB を分離する前にこのパケットが送られる．
返答：なし．GDB はこのパケットの送信後の返答のためのチェックを行わない
将来使用するための予約
このパケットは，ターゲットによって送られたリクエスト・パケット F に対する GDB からの返答．これは，ファイル I/O リモート・プロトコルの一部なので無視してよいレジスタを読み取る．
返答： XX... レジスタ・データのそれぞれのバイトは，二つの hex のけたにより表され，バイト・オーダはターゲット・システムのものに準じる．レジスタのサイズや名前などは，GDB の内部で DEPRECATED̲REGISTER̲RAW̲SIZE と REGISTER̲NAME のマクロで定義されているXX...のフォーマットは読み出しと同じ．返答： OK 成功， ENN エラー
将来使用するための予約スレッドへパケット操作（m, M, g, G など）を送信する． c はステップとコンティニュのために， g はほかのオペレーションのために付加される．t...に t スレッド番号を指定する．
− 1 を指定するとすべてのスレッドという意味．
返答： OK 成功， ENN エラー
将来使用するための予約――
将来使用するための予約メモリを addr アドレスから length バイト読み取る．addr，length は 16 進数．
返答： XX... はメモリの内容を 16 進数で返す． ENN NN はエラー番号
メモリの addr 番地から length バイトに XX...のデータを書き込む．addr，length，XX...
は 16 進数．返答： OK 成功， ENN エラー
将来使用するための予約
レジスタ番号 n に値 r を書き込む

以上の理由から，ホスト・マシンとターゲット・マシンがシリアル・ケーブルで接続され，ターゲット・マシンに2．GDB リモート・シリアル・プロトコル

リモート・シリアル・プロトコル実装用の ROM モニタが実行されていれば，どのようなターゲット CPU でも GDBGDB の機能の恩恵を受ける際には，GNU ツールでコンで組み込みプログラムのデバッグ環境を構築することが可パイルされた ELF などの実行形式ファイルを作成する環

能になります．このリモート・シリアル・プロトコルを実境と GDB スタブを必要とします．GNU ツールについては装する ROM モニタのことを GDB スタブと呼びます．

前章で説明したので，ここでは GDB スタブについて説明

従って，本稿で前提とする環境は，図 1 に示すようにホします．まず，GDB スタブを作成する上で重要なリモー

スト・マシンとターゲット・マシンがシリアル・ケーブル

ト・シリアル・プロトコルについて解説します．

でつながれているものです．ホスト・マシンでは GDB が● プロトコルの概要

起動されていて，ターゲット・マシンでは GDB スタブが実行されている環境を考えます．

リモート・シリアル・プロトコルは GDB ドキュメントに規定されています．
http://sources.redhat.com/gdb/download/onlinedocs/gdb_33.html#SEC655

66

News Flash ――仕様記述や合意方法を標準化する「発注者ビューガイドライン（画面編）」を公開
NTT データなど 9 社は，情報システムの仕様記述や合意方法を共通化する「発注者ビューガイドライン（画面編）」を公開した．発注者と開発者の間の誤った理解を防ぐ狙いがある．富士通，NEC，日立製作所，構造計画研究所，東芝ソリューションなどが策定に参加した．

Dec. 2007