次: , 上: Remote Serial


13.4.1.1 スタブの提供する機能

各アーキテクチャ用のデバッグ・スタブは、 3つのサブルーチンを提供します。

set_debug_traps
このルーチンは、 ユーザ・プログラムが停止したときにhandle_exceptionが実行されるよう設定します。 ユーザ・プログラムは、 その先頭付近でこのサブルーチンを明示的に呼び出さなければなりません。
handle_exception
これが中心的な仕事をする部分ですが、 ユーザ・プログラムはこれを明示的には呼び出しません。 セットアップ・コードによって、 トラップが発生したときに handle_exceptionが実行されるよう設定されます。

ユーザ・プログラムが実行中に (例えば、ブレイクポイントで) 停止すると、 handle_exceptionが制御権を獲得し、 ホスト・マシン上のGDBとの通信を行います。 これが、 通信プロトコルが実装されている部分です。 handle_exceptionは、 ターゲット・マシン上でGDBの代理として機能します。 それはまず、 ユーザ・プログラムの状態に関する情報を要約して送ることから始めます。 次に、 GDBが必要とする情報を入手して転送する処理を継続します。 これは、 ユーザ・プログラムの実行を再開させるようなGDBコマンドが実行されるまで続きます。 そのようなコマンドが実行されると、 handle_exceptionは、 制御をターゲット・マシン上のユーザ・コードに戻します。

breakpoint
ユーザ・プログラムにブレイクポイントを持たせるには、 この補助的なサブルーチンを使います。 特定の状況においては、 これがGDBが制御を獲得する唯一の方法です。 例えば、 ユーザのターゲット・マシンに割り込みを発生させるボタンのようなものがあれば、 このサブルーチンを呼び出す必要はありません。 割り込みボタンを押すことで、 制御はhandle_exceptionに、 つまり事実上GDBに渡されます。 マシンによっては、 シリアル・ポートから文字を受け取るだけでトラップが発生することもあります。 このような場合には、 ユーザ・プログラム自身からbreakpointを呼び出す必要はなく、 ホストのGDBセッションから`target remote'を実行するだけで制御を得ることができます。

これらのどのケースにも該当しない場合、 あるいは、 デバッグ・セッションの開始箇所としてあらかじめ決めてあるところでユーザ・プログラムが停止することを 単に確実にしたいのであれば、 breakpointを呼び出してください。