プログラム実行の制御
この項では、プログラムをデバッグ用に準備し、プログラムを実行し、 ブレークポイントを設定、表示、および削除し、プログラムを継続し、 プログラムをシングル・ステップで実行し、プログラムを停止し、 プログラムを kill するために必要なコマンドとサブコマンドについて説明します。
adb プログラムによるデバッグのためのプログラムの準備
adbsamp2 のようなファイルに対して、cc コマンドを使用してプログラムをコンパイルするには、 次のように入力します。
cc adbsamp2.c -o adbsamp2デバッグ・セッションを開始するには、次のように入力します。
adb adbsamp2C 言語は、プログラム用のステートメント・ラベルを生成しません。 したがって、ユーザーは、デバッグ・プログラムを使用する場合、 個別の C 言語ステートメントを参照することはできません。 実行コマンドを効果的に使用するには、C コンパイラーが生成する命令、 およびこれらの命令が個別の C 言語ステートメントにどのように関連するかを理解する必要があります。 有効な手法の 1 つとしては、adb プログラムを使用する前に、 ユーザーの C プログラムのアセンブラー言語リストを作成します。 そして、デバッグ・プログラムを使用する時に、そのリストを参照します。 アセンブラー言語リストを作成するには、cc コマンドの -S または -qList フラグを使用します。
例えば、サンプル・プログラム adbsamp2.c のアセンブラー言語リストを作成するには、 次のコマンドを使用します。
cc -S adbsamp2.c -o adbsamp2このコマンドは、プログラムのアセンブラー言語リストが入っている adbsamp2.s ファイルを作成し、 プログラムをコンパイルして、 実行可能ファイル adbsamp2 を作成します。
プログラムの実行
:r または :R サブコマンドを使用すれば、 プログラムを実行することができます。 コマンドの形式を以下に示します。
[ Address ][, Count ] :r [Arguments ]
OR
[ Address ][, Count ] :R [Arguments ]
この形式の中で、Address パラメーターは、 プログラムの実行を開始するアドレスを示します。 Count パラメーターは、スキップするブレークポイントの数です。 Arguments パラメーターは、プログラムに渡すための、 ファイル名およびオプションなどのコマンド・ライン引数を提供します。
Address 値を指定しないと、adb プログラムはプログラムの開始アドレスを使用します。 プログラムを最初から実行するには、次のように入力します。
:rCount 値を指定すると、adb プログラムは指定された個数のブレークポイントが検出されるまで、 すべてのブレークポイントを無視します。 例えば、指定されたブレークポイントの最初の 5 つをスキップするには、次のコマンドを使用します。
,5:r複数の引数を指定する場合、 各引数を少なくとも 1 つのスペースで分離してください。 引数は、システム・シェルがコマンド・ライン引数をプログラムに渡す場合と同じ方法でプログラムに渡されます。 シェル・リダイレクト・シンボルを使用することができます。
:R サブコマンドは、 プログラム操作の開始する前に、シェルを介してコマンド引数を渡します。 引数内でシェル・パターン・マッチング文字を使用して、 複数のファイルまたは他の入力値を参照することができます。 シェルは、パターン・マッチング文字が使われている引数を、 プログラムに渡す前に拡張します。 この機能は、 プログラムで複数のファイル名が想定されている場合に便利です。 例えば、次のコマンドは、引数 [a-z]* をシェルに渡します。 引数はシェルで、対応するファイル名のリストに拡張されてから、 プログラムに渡されます。
:R [a-z]*.s:r および :R サブコマンドは、 プログラムを開始する前に、すべてのレジスターの内容を除去し、 現在のスタックを破棄します。 そのプログラムの以前のコピーが実行中の場合、この操作によって実行が停止されます。
ブレークポイントの設定
プログラム内のブレークポイントを設定するには、:b サブコマンドを使用します。 ブレークポイントは、プログラムが指定されたアドレスに到達すると、 操作を停止します。 次に、制御が adb デバッグ・プログラムに戻ります。 コマンドの形式は次のとおりです。
[Address] [,Count ] :b [Command]
この形式の中で、Address パラメーターは有効な命令アドレスでなければなりません。 Count パラメーターは、 ブレークポイントによってプログラムを停止する前に、ブレークポイントをスキップする回数です。 Command パラメーターは、 命令の実行ごとに (ブレークポイントがプログラムを停止するかどうかに関係なく) 実行する必要がある adb コマンドです。 指定したコマンドが、. (ピリオド) を値 0 に設定した場合、 このブレークポイントによってプログラムが停止します。
関数の先頭などのプログラムの特定の場所でプログラムの実行を停止するようにブレークポイントを設定して、 レジスターおよびメモリーの内容を調べてください。 例えば、プログラム例 adbsamp2 をデバッグする場合、 次のコマンドによって、f という名前の関数の先頭にブレークポイントが設定されます。
.f :bブレークポイントは、制御が関数に渡った後で、 しかも関数のスタック・フレームが作成される前に処理されます。
カウントを指定したブレークポイントは、プログラムの操作中に複数回呼び出される関数内で、 あるいは for または while ステートメントに対応する命令内で使用します。 このようなブレークポイントによって、 指定した関数または命令が指定した回数実行されるまで、 プログラムを実行し続けることができます。 例えば、次のコマンドは、adbsamp2 プログラム内で f 関数が 2 度目に呼び出された時点にブレークポイントを設定します。
.f,2 :bこのブレークポイントは、この関数が 2 度目に実行されるまで、関数を停止しません。
ブレークポイントの表示
現在定義されている各ブレークポイントの位置およびカウントを表示するには、$b サブコマンドを使用します。 このコマンドは、アドレスごとのブレークポイントのリスト、 および各ブレークポイントに指定されたカウントまたはコマンドを表示します。 例えば、次の例は、adbsamp2 ファイル内に 2 つのブレークポイントを設定してから、$b サブコマンドを使用してそれらのブレークポイントを表示しています。
.f+4:b
.f+8:b$v
$b
breakpoints
count brkpt command
1 .f+8 $v
1 .f+4プログラムは、実行時、検出した最初のブレークポイント (.f+4) で停止します。 :c サブコマンドを使用して実行を継続すると、 プログラムは次のブレークポイントで再び停止して、$v サブコマンドを開始します。 コマンドと応答のシーケンスは、次の例のようになります。
:r
adbsamp2:running
breakpoint .f+4: st r3,32(r1)
:c
adbsamp2:running
variables
b = 268435456
d = 236
e = 268435512
m = 264
breakpoint .f+8 l r15,32(r1)ブレークポイントの削除
:d サブコマンドを使用して、 プログラムからブレークポイントを削除するには、次のように入力します。
Address :d
この形式の中で、Address パラメーターは、 削除するブレークポイントのアドレスを示します。
例えば、サンプル・プログラム adbsamp2 をデバッグする場合、次のコマンドを入力すると、f 関数の先頭のブレークポイントが削除されます。
.f:dプログラム実行の継続
プログラムをブレークポイントによって停止した後に、 プログラム実行を継続するために :c サブコマンドを使用するには、 次のように入力します。
[Address ] [,Count ] :c [Signal ]
この形式の中で、Address パラメーターは、 操作を継続する命令のアドレスを示します。 Count パラメーターは、無視するブレークポイントの数を示します。 Signal パラメーターは、プログラムに送信するシグナルの数です。
Address パラメーターを指定しないと、プログラムは、 ブレークポイントの後の次の命令を開始します。 Count パラメーターを指定すると、adb デバッグ・プログラムは最初の Count 個のブレークポイントを無視します。
割り込みキーまたは終了キーを使用してプログラムを停止した場合、このシグナルは、 再始動時にプログラムに自動的に渡されます。 このシグナルがプログラムに渡されるのを防ぐには、 次の形式のコマンドを入力してください。
[Address] [,Count] :c 0
コマンド引数 0 は、 シグナルがサブプロセスに送られるのを防ぎます。
プログラムのシングル・ステップ実行
:s サブコマンドを使用すれば、プログラムをシングル・ステップで (すなわち、1 命令ずつ) 実行することができます。 このコマンドは 1 つの命令を発行すると、制御を adb デバッグ・プログラムに戻します。 コマンドの形式は次のとおりです。
[Aaddress ] [,Count ] :s [Signal]
この形式の中で、Address パラメーターは、 実行する必要がある命令のアドレスを示します。 Count パラメーターは、 コマンドを反復する必要がある回数です。 現在のサブプロセスがない場合、ObjectFile パラメーターがサブプロセスとして実行されます。 この場合、シグナルは送信できません。 また、行の残りの部分は、サブプロセスの引数として処理されます。 Address パラメーターの値を指定しないと、adb プログラムは現在のアドレスを使用します。 Count パラメーターを指定すると、adb プログラムは、Count パラメーターの数だけ後続の命令を発行します。 単一ステップ時は、 ブレークポイントは無視されます。 例えば、次のコマンドは、main 関数内の最初の 5 つの命令を発行します。
.main,5:s割り込みキーと終了キーによるプログラムの停止
割り込みキーまたは終了キーを使用すれば、 いつでもプログラムの実行を停止することができます。 これらのキーのいずれかを押すと、現在のプログラムが停止され、 制御が adb プログラムに戻ります。 これらのキーは、 プログラムに無限ループまたは他のプログラム・エラーがある場合に役立ちます。
プログラムを停止するために割り込みキーまたは終了キーを押すと、adb プログラムは自動的にシグナルを保管します。 :c コマンドを使用してプログラムを再び開始した場合、adb プログラムはシグナルをプログラムに自動的に渡します。 この機能は、処理の一部としてこれらのシグナルを使用するプログラムをテストする 場合に役立ちます。 シグナルを送信しないで、プログラムの実行を継続するには、 次のコマンドを使用してください。
:c 0コマンドの引数 0 (ゼロ) は、 シグナルがプログラムに送信されるのを防ぎます。
プログラムの停止
デバッグ対象のプログラムを停止するには、:k サブコマンドを使用します。 このコマンドはこのプログラムのために作成されたプロセスを停止し、 制御を adb デバッグ・プログラムに戻します。 このコマンドはシステム装置のレジスターとスタックの現在の内容をクリアしてから、 プログラムを再び開始します。 次の例は、adb プログラムから現在のプロセスをクリアするための :k サブコマンドの使用法を示しています。
:k 560: killed