OpenBoot は、逆アセンブラ、レジスタ表示用コマンド、ブレークポイント関連コマンドなどのデバッグツールを提供します。
組み込み逆アセンブラはメモリーの内容を、対応する SPARC アセンブル言語に翻訳します。
表 6-1 に、メモリーの内容を対応するオペコードに逆アセンブルするコマンドを示します。
表 6-1 逆アセンブラコマンド
コマンド |
スタックダイアグラム |
説明 |
---|---|---|
+dis |
( -- ) |
最後に逆アセンブルを終了したところから逆アセンブルを継続します。 |
dis |
( addr -- ) |
指定されたアドレスから逆アセンブルを開始します。 |
dis は指定する任意のアドレスから、メモリーの内容の逆アセンブルを開始します。システムは次の場合に中断します。
中断したら、逆アセンブルを停止することも、+dis コマンドを使用して最後に停止したところから逆アセンブルを継続することもできます。
メモリーアドレスは通常は 16 進で示されますが、シンボルテーブルがある場合は、メモリーアドレスは可能なかぎりシンボルで表示されます。
プログラムがクラッシュしたり、ユーザーが Stop-A で中止したり、あるいはブレークポイントに遭遇した結果、プログラムの実行途中でユーザーインタフェースに入ってしまうことがあります。(ブレークポイントについては、「ブレークポイント」 で説明します。) 上記の場合には、ユーザーインタフェースは自動的にすべての CPU データレジスタの値をバッファー領域に保存します。デバッグの目的のためにそれらの値を調べたり、変更することができます。
表 6-2 に SPARC のレジスタ操作コマンドを示します。
表 6-2 SPARC レジスタコマンド
値の確認や変更が終わったら、go コマンドを使用してプログラムの実行を継続できます。保存したレジスタの値 (変更したものを含めて) は、(コピーして) CPU に戻され、保存されたプログラムカウンタによって指定された位置から実行が再開されます。
to を使用して %pc を変更する場合は、%npc も同時に変更する必要があります。(set-pc の方が両レジスタを自動的に変更するので簡単です。)
w および .window コマンドについては、ウィンドウ値 0 は通常、現在のウィンドウを指定します。つまり、プログラムが中断されたときのサブルーチンのアクティブウィンドウです。ウィンドウ値が 1 の場合は、そのサブルーチンの呼び出し元のウィンドウであり、2 の場合はその呼び出し元の呼び出し元を指定します。以下同様に、有効なスタックフレーム数までこの関係が繰り返されます。デフォルトの開始値は 0 です。
ユーザーインタフェースは、スタンドアロンプログラムの開発とデバッグの支援用として、ブレークポイント機能を備えています。(オペレーティングシステムのもとで実行されるプログラムは、一般的にこの機能は使用しないで、オペレーティングシステムのもとで動作するほかのデバッガを使用します。) ブレークポイント機能では、テストプログラムを停止させたい場所で停止することができます。プログラムの実行が停止した後は、レジスタまたはメモリーを調べたり、変更できるほか、ブレークポイントを新たに設定またはクリアすることができます。プログラムの実行は go コマンドで再開できます。
表 6-3 に、プログラム実行の制御、監視用のブレークポイントコマンドを示します。
表 6-3 ブレークポイントコマンド
ブレークポイントを使用してプログラムをデバッグするには、次の手順に従います。
テストプログラムをメモリーアドレス 4000 (16 進) へ読み込みます。
詳細は、第 5 章「プログラムの読み込みと実行」を参照してください。一般的に dload を使用するのが最善の方法です。理由は、プログラムのシンボルテーブルが保存されるためです。Ethernet を介してプログラムを読み込めない場合は、 boot -h も同じ機能を果たします。
%pc およびそのほかのすべてのレジスタの値が自動的に初期設定されます。
(省略可能) ダウンロードされたプログラムを逆アセンブルして、ファイルが正しく読み込まれているかどうかを確認します。
step コマンドを使用してテストプログラムを 1 命令ずつ実行します。
さらに、ブレークポイントを設定し、実行したり (たとえば、4020+bp および goコマンドを実行します)、ほかの方法で実行することもできます。
Forth ソースレベルデバッガでは、Forth プログラムのステップ実行およびトレースが可能です。各実行ステップが 1 つの Forth ワードに対応します。
表 6-4 にこのデバッガのコマンドを示します。
表 6-4 Forth ソースレベルデバッガコマンド
すべての Forth ワードはそれぞれに、「コンポーネント」ワードと呼べる 1 つまたは複数の一連のワードとして定義されています。指定されたワードをデバッグしている間に、デバッガは、そのワードの各「コンポーネント」ワードを実行中にスタックの内容に関する情報を表示します。各コンポーネントワードを実行する直前に、デバッガはスタックの内容と、実行されようとしているコンポーネントワードの名前を表示します。
トレースモードでは、そのコンポーネントワードがそこで実行され、プロセスは次のコンポーネントワードに引き継がれます。
ステップモード (デフォルト) では、ユーザーがデバッガの実行動作を制御します。各コンポーネントワードの実行前に、ユーザーはプロンプトで 表 6-4にある 1 つのキー操作のどれかを求められます。
ftrace コマンドは、最後の例外割り込み時に実行されていた Forth ワード処理を表示します。次に ftrace の例を示します。
ok : test1 1 ! ; ok : test2 1 test1 ; ok test2 Memory address not aligned ok ftrace ! Called from test1 at ffeacc5c test1 Called from test2 at ffeacc6a (ffe8b574) Called from (interpret at ffe8b6f8 execute Called from catch at ffe8a8ba ffefeff0 0 ffefebdc catch Called from (fload) at ffe8ced8 0 (fload) Called from interact at ffe8cf74 execute Called from catch at ffe8a8ba ffefefd4 0 ffefebdc catch Called from (quit at ffe8cf98 |
上記の例では、test2 が test1 を呼び出し、test1 は境界に合わないアドレスに値を格納しようとします。その結果、Memory address not aligned という例外が発生します。
ftrace の出力の 1 行目は、例外を発生させた最後のコマンドを示しています。2 行目以降は、その後のコマンドが呼び出されようとしていたメモリーアドレスを示しています。
最後の 13 行は、通常どの ftrace の出力とも同じですが、これは、それが Forth インタプリタが入力ストリームからワードを解釈するときに有効な呼び出し処理であるからです。