デバッグ情報なしでコンパイルまたはアセンブルされたプログラムをデバッグする場合は、逆アセンブリー表示を使用できます。逆アセンブリー表示を使用する場合、元のソース・プログラムのシンボル情報 (プログラム変数、ラベル、およびその他のメモリー・セクションへのシンボルによる参照など) は使用できません。 逆アセンブリー表示を使用するにはその前に、DYNDEBUG スイッチが ON でなければなりません。
デバッグしているプログラムについて完全に理解していない場合は、デバッグ作業の間、コンパイラーまたは高水準アセンブラー (HLASM) によって作成されたリスト 1 部を手元に用意しておくことをお勧めします。逆アセンブリー表示を使用する場合にプログラムが従わなければならない、特定のアセンブリー要件またはコンパイル要件はありません。
SET ASSEMBLER ON と SET DISASSEMBLY ON コマンドは、 いくつかの同じ機能を使用可能にします。ただし、どちらのコマンドを使用するかを決める前に、 デバッグする CU のタイプ (アセンブラー、逆アセンブリー、またはその両方) を考慮する必要があります。 使用するコマンドを決める際には、次のガイドラインが役立ちます。
アセンブラー CU をデバッグしていて、その後、逆アセンブリー CU をデバッグすることにした場合、 SET ASSEMBLER ON コマンドを入力した後 SET DISASSEMBLY ON コマンドを入力することができます。
逆アセンブリー表示を使用すると、以下のタスクを実行することができます。
逆アセンブリー表示を開始するには、次の操作を行ってください。
デバッグ・データを含むプログラムを入力した場合、言語設定は変更されず、逆アセンブリー・コードはソース・ウィンドウに表示されません。
逆アセンブリー表示を介してプログラムをデバッグする場合は、ソース・ウィンドウに逆アセンブリー命令が表示されます。Debug Tool 画面の言語領域 (左上隅) に「Disassem」という語が表示されます。Debug Tool 画面の表示は、次のとおりです。
Disassem LOCATION: MAIN initialization
Command ===> Scroll ===> PAGE
MONITOR --+----1----+----2----+----3----+----4----+----5----+----6 LINE: 0 OF 0
******************************* TOP OF MONITOR ********************************
****************************** BOTTOM OF MONITOR ******************************
SOURCE: MAIN +----1----+----2----+----3----+----4----+----5----+ LINE: 1 OF 160
0 1950C770 47F0 F014 BC 15,20(,R15) .
A 4 1950C774 00C3 ???? .
6 1950C776 B C5C5 ???? .
8 1950C778 0000 ???? .
A 1950C77A 0080 C ???? .
C 1950C77C 0000 ???? .
E 1950C77E 00C4 ???? D .
10 1950C780 47F0 F001 BC 15,1(,R15) .
14 1950C784 90EC D00C STM R14,R12,12(R13) .
18 1950C788 18BF LR R11,R15 E .
1A 1950C78A 5820 B130 L R2,304(,R11) .
1E 1950C78E 58F0 B134 L R15,308(,R11) .
22 1950C792 05EF BALR R14,R15 .
24 1950C794 1821 LR R2,R1 .
26 1950C796 58E0 C2F0 L R14,752(,R12) .
2A 1950C79A 9680 E008 OI 8(R14),128 .
2E 1950C79E 05B0 BALR R11,0 .
LOG 0----+----1----+----2----+----3----+----4----+----5----+----6- LINE: 1 OF 5
********************************* TOP OF LOG **********************************
0001 IBM Debug Tool Version 9 Release 1 Mod 0
0002 10/03/2008 4:11:41 PM
0003 5655-U27: Copyright IBM Corp. 1992, 2008
0004 EQA1872E An error occurred while opening file: INSPPREF. The file may not
0005 exist, or is not accessible.
0006 SET DISASSEMBLY ON ;
PF 1:? 2:STEP 3:QUIT 4:LIST 5:FIND 6:AT/CLEAR
PF 7:UP 8:DOWN 9:GO 10:ZOOM 11:ZOOM LOG 12:RETRIEVE
逆アセンブリー表示を使用する場合、ソース・エリア内に表示される逆アセンブリー命令は正確であるとは限りません。これは、常に命令からデータを区別できるとは限らないためです。不正確な場合に備えて、コンパイラーまたは HLASM によって作成されたリスト 1 部を手元に用意しておくことをお勧めします。Debug Tool は、例えば STEP コマンドの後など、マシン・コードを実行する際は常にソース・ウィンドウを最新表示して、逆アセンブリー表示をできるだけ正確に保ちます。
STEP コマンドを使用して、プログラムを単一ステップスルーします。逆アセンブリー表示内で、1 つの逆アセンブリー命令から次の命令へのステップを実行します。Debug Tool は、次に実行する命令を強調表示します。
ユーザーのプログラムを呼び出したプログラムの中へ戻りたい場合、呼び出し側プログラムで戻りたい命令のところにブレークポイントを設定します。別のプログラムへ移る場合は、別のプログラムを呼び出す命令の直後にブレークポイントを設定します。プログラムの外に出る場合、Debug Tool は警告メッセージを表示し、適切なブレークポイントをユーザーが設定できるようにします。設定を行った後、プログラムから抜け出ることができます。
Debug Tool は、表示されている逆アセンブリー命令が正しくないと判断すると、逆アセンブリー表示を最新表示します。画面の最新表示は、プログラムをステップスルーしている間に発生する場合があります。
逆アセンブリー表示を介してユーザーのプログラムをデバッグする場合、専用のブレークポイントを使用することができます。AT OFFSET は、CSECT の入り口点アドレスの先頭から計算した場所にブレークポイントを設定します。ブレークポイントを設定する方法は、コマンド行に AT OFFSET コマンドを入力する方法と、ブレークポイントを設定したい行の接頭部域にカーソルを置いて、AT ファンクション・キーを押すか、接頭部域に AT を入力する方法があります。
Debug Tool では、アドレスが有効な命令コードと見なされ、かつ、オフセットが偶数であれば、CU または CSECT の開始アドレスと終了アドレスの範囲内のどこにでもブレークポイントを設定することができます。誤ったオフセットにブレークポイントを設定するのを避けるため、HLASM またはコンパイラーによって作成されたリストを参照してオフセットを検査することをお勧めします。
Debug Tool は自己修正コードをデバッグできません。 プログラムが命令を変更する自己修正コードを含み、そのコードを含むコンパイル単位をデバッグする場合、 結果は、Debug Tool の異常終了 (ABEND) を含めて予測不能となる可能性があります。 プログラムが命令を完全に置き換える自己修正コードを含み、そのコードを含むコンパイル単位をデバッグする場合、 結果が ABEND とはならない場合があります。 ただし、Debug Tool は、その命令に関するブレークポイントを見逃したり、 削除時に無効なフック・アドレスを示すメッセージを表示したりする場合があります。
次のコーディング手法により、自己修正コードのデバッグ時の問題を最小限にできます。
| 命令を変更するコーディング | 命令を置き換えるコーディング |
|---|---|
ModInst BC 0,Target ... MVI ModInst+1,X'F0' |
ModInst BC 0,Target ... MVC ModInst(4),NewInst ... NewInst BC 15,Target |
LIST REGISTERS コマンドを使用することにより、すべてのレジスターの内容を表示することができます。個々のレジスターの内容を表示するには、LIST Rx コマンドを使用してください。この場合、x はここのレジスター番号を表します。レジスター上にカーソルを置き LIST ファンクション・キーを押すことによっても、個々のレジスターの内容を表示することができます。デフォルトの LIST ファンクション・キーは、PF4 です。レジスターの内容は、アセンブラーの割り当てステートメントで変更できます。
LIST STORAGE コマンドを使用することにより、ストレージの内容を表示することができます。STORAGE コマンドを使用することにより、ストレージの内容を変更することができます。
また、アセンブラー・ステートメントでもストレージの表示や変更を行えます。 例えば、レジスター 2 に入ったアドレスにある 4 バイトをゼロに設定するには、 次のコマンドを入力します。
R2-> <4>=0
この 4 バイトがゼロに設定されたことを確認するには、次のコマンドを入力します。
LIST R2->
SET QUALIFY コマンドを使用して、逆アセンブリー表示に表示されているプログラムを変更することができます。例えば、プログラム ABC のデバッグ中に、プログラム BCD にブレークポイントを設定する必要があるとします。
逆アセンブル・プログラムをデバッグする場合、以下の制約事項が適用されます。
逆アセンブリー表示を使用してプログラムをデバッグする場合、以下のいずれの状態においても Debug Tool は、アプリケーションを停止することができません。
アプリケーションは、Debug Tool が有効な保存域の逆チェーンを検出するまで実行されます。