Next: Debug Session, Previous: Stub Contents, Up: Remote Serial
GDBとともに配布されるデバッグ用スタブは、 特定のチップのアーキテクチャ用にセットアップされたものですが、 デバッグのターゲット・マシンに関してそれ以外の情報は持っていません。
まず最初に、 どのようにしてシリアル・ポートと通信するかをスタブに教えてやる必要があります。
int getDebugChar()
getchar
と同一かもしれません。
これら2つを区別したい場合を考慮して、
異なる名前が使われています。
void putDebugChar(int)
putchar
と同一かもしれません。
これら2つを区別したい場合を考慮して、
異なる名前が使われています。
実行中のユーザ・プログラムをGDBが停止できるようにしたいのであれば、
割り込み駆動型のシリアル・ドライバを使用して、
^C
(control-C文字、
すなわち‘\003’)
を受信したときに停止するよう設定する必要があります。
GDBはこの文字を使って、
リモート・システムに対して停止するよう通知します。
デバッグ・ターゲットが適切なステータス情報をGDBに対して返せるようにするためには、
おそらく標準のスタブを変更する必要があるでしょう。
最も美しくなく、
しかし最も手っ取り早くこれを実現する方法は、
ブレイクポイント命令を実行することです
(この方法が「美しくない」のは、
GDBがSIGINT
ではなくSIGTRAP
を報告してくる点にあります)。
ユーザが提供する必要のあるルーチンには、 ほかに以下のようなものがあります。
void exceptionHandler (int
exception_number, void *
exception_address)
386では、
ハンドラが実行されているときに割り込みがマスクされるよう、
exception_addressは割り込みゲートとして組み込まれる必要があります。
そのゲートは特権レベル0
(最も高いレベル)
でなければなりません。
sparc用のスタブや68k用のスタブは、
exceptionHandler
の助けを借りなくても自分で割り込みをマスクすることができます。
void flush_i_cache()
命令キャッシュを持つターゲット・マシン上のGDBは、 ユーザ・プログラムが安定した状態にあることが この関数によって保証されることを必要とします。
また、次のライブラリ・ルーチンが使用可能であることを確かめなければなりません。
void *memset(void *, int, int)
memset
です。
フリーのlibc.a
を持っていれば、
そこにmemset
があります。
フリーのlibc.a
がなければ、
memset
をハードウェアの供給元から入手するか、
自分で作成する必要があります。
gnu Cコンパイラを使っていないのであれば、
他の標準ライブラリ・サブルーチンも必要になるかもしれません。
これは、
スタブによっても異なりますが、
一般的にスタブは、
gcc
がインライン・コードとして生成する共通ライブラリ・サブルーチンを使用する可能性があります。