デバッグ情報を使用してアセンブルされたプログラムをデバッグするときには、ほとんどの Debug Tool コマンドを使用できます。例外については、「Debug Tool リファレンスおよびメッセージ」に記載されています。アセンブラー・プログラムをデバッグする前に、アセンブラー・プログラムの準備の説明に従ってプログラムを準備してください。
SET ASSEMBLER ON と SET DISASSEMBLY ON コマンドは、 いくつかの同じ機能を使用可能にします。ただし、どちらのコマンドを使用するかを決める前に、 デバッグする CU のタイプ (アセンブラー、逆アセンブリー、またはその両方) を考慮する必要があります。 使用するコマンドを決める際には、次のガイドラインが役立ちます。
アセンブラー CU をデバッグしていて、その後、逆アセンブリー CU をデバッグすることにした場合、 SET ASSEMBLER ON コマンドを入力した後 SET DISASSEMBLY ON コマンドを入力することができます。
LOADDEBUGDATA (または LDD) コマンドを使用して、コンパイル単位がアセンブラーのコンパイル単位であることを Debug Tool に示し、そのコンパイル単位に関連したデバッグ情報を読み込みます。LDD コマンドは、デバッグ情報を保持していないことから逆アセンブルであるとみなされるコンパイル単位に対してのみ発行できます。次の例の mypgm は、アセンブラー・プログラムのコンパイル単位 (CSECT) 名です。
LDD mypgm
デバッグ情報は、yourid.EQALANGX(mypgm) という名前のデータ・セットに入っています。Debug Tool がこのデータ・セットを検出すると、アセンブラー・プログラムのデバッグを開始できます。データ・セットが見つからない場合は、SET SOURCE または SET DEFAULT LISTINGS コマンドを入力し、デバッグ情報の検索場所を Debug Tool に指示します。リモート・デバッグ・モードでは、プログラムへ入る時に、データ・セット情報を入力するようにリモート・デバッガーからプロンプトが出されます。
通常、デバッグ情報を持たないコンパイル単位は、DESCRIBE CUS または LIST NAMES CUS コマンドを入力してもリストされません。これらのコンパイル単位をリストに含めるには、SET ASSEMBLER ON コマンドを入力します。次回 DESCRIBE CUS または LIST NAMES CUS コマンドを入力するときに、これらのコンパイル単位がリストされます。
下図の Debug Tool セッション・パネルは、アセンブラー・プログラムのデバッグ中にソース・ウィンドウで表示される情報を示しています。
Assemble LOCATION: PUBS :> 34.1 Command ===> Scroll ===> CSR MONITOR --+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+---10----+--- LINE: 0 OF 0 ******************************************************* TOP OF MONITOR ******************************************************** ****************************************************** BOTTOM OF MONITOR ****************************************************** SOURCE: PUBS +----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+---10-- LINE: 60 OF 513 1 34 2 3 * 7 . 34 00000078 OPENIT EQU * . 34 00000078 + OPEN ((2),INPUT) . 34 4 + CNOP 0,4 ALIGN LIST TO FULLWORD . 34 00000078 4510 B080 + BAL 1,*+8 LOAD REG1 W/LIST ADDR. @L2A . 35 0000007C + DC A(0) OPT BYTE AND DCB ADDR. . 36 00000080 5021 0000 + ST 2,0(1,0) STORE INTO LIST @L1C. . 37 00000084 9280 1000 + MVI 0(1),128 MOVE IN OPTION BYTE . 38 00000088 0A13 + SVC 19 ISSUE OPEN SVC . 39 5 6 CALL CEEMOUT,(STRING,DEST,0),VL Omitted feedback code . 39 + SYSSTATE TEST @L3A . 39 + CNOP 0,4 . LOG 0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+---10----+---1 LINE: 1 OF 9 ********************************************************* TOP OF LOG ********************************************************** 0001 IBM Debug Tool Version 9 Release 1 Mod 0 0002 10/30/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 exist, or is not accessible. 0005 Source or Listing data is not available, or the CU was not compiled with the correct compile options. 0006 LDD PUBS ; 0007 SET DEFAULT SCROLL CSR ; 0008 AT 34 ; 0009 GO ; ******************************************************** BOTTOM OF LOG ******************************************************** 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
ソース・ウィンドウに表示される情報は、アセンブラーによって生成されるリストの情報と同じです。ソース・ウィンドウには、以下の情報が表示されます。
複数行に同じステートメント番号を割り当てることができる場合もあります。コメント、ラベル、およびマクロ呼び出しには、これらのステートメントに続くマシン・インストラクションと同じステートメント番号が割り当てられます。これらのステートメントには、CSECT 内で同じオフセットが割り当てられます。これにより、これらのいずれかの行にカーソルを移動し、PF6 を押すと、ブレークポイントを設定できます。このステートメントに達すると、マクロ呼び出しまたはマシン・インストラクションのいずれかが含まれているステートメント内の最初の行にフォーカスが設定されます。
ここで述べた内容に関して詳しくは、以下のトピックを参照してください。
次の表に、現在のプログラム言語がアセンブラーの場合に、Debug Tool の %PATHCODE 変数に使用可能な値を示します。
| %PATHCODE | エントリー・タイプ | 命令 | 追加要件またはコメント |
|---|---|---|---|
| 1 | ブロックに入っています。 | すべて | オフセットが命令に対応する外部シンボル。 |
| 2 | ブロックから出ようとしています。 |
BR R14 (07FE) |
|
BALR R14,R15 (05EF) |
これらの命令は、この命令の後に有効な命令が続いていない場合にのみ、出口として扱われます。 | ||
BASR R14,R15 (0DEF) |
|||
BASSM R14,R15 (0CEF) |
|||
BCR 15,x (07Fx) |
|||
| 3 | プログラムにコーディングされたラベルに制御が到達した。 | すべて | オフセットが命令に対応するラベル。 |
| 4 | CALL の結果、制御が渡されている。 |
BALR R14,R15 (05EF) |
|
BASR R14,R15 (0DEF) |
|||
BASSM R14,R15 (0CEF) |
|||
| SVC (0A) | |||
| PC (B218) | |||
| BAL (45) | BAL 1,xxx 以外は、CALL として扱われません。 | ||
| BAS (4D) | |||
BALR x,y (05) |
|||
BASR x,y (0D) |
|||
BASSM x,y (0C) |
|||
| BRAS (A7x5) | |||
| BRASL (C0x5) | |||
| 5 | CALL から制御が戻っている。 | CALL に続くステートメント | CALL に続くステートメントが命令である場合は、ここでエントリーを取得します。 |
| 6 | 条件付き分岐が実行されようとしている。 | BC x (47x) | x^=15 & X^=0 |
| BCR x (07x) | x^=15 & X^=0 | ||
| BCT (46) | |||
| BCTR (06) | |||
| BCTGR (B946) | |||
| BXH (86) | |||
| BXHG (EB44) | |||
| BXLE (87) | |||
| BXLEG (EB45) | |||
| BRC x (A7x4) | x^=15 & X^=0 | ||
| BRCL (C0x4) | |||
| BRCT (A7x6) | |||
| BRCTG (A7x7) | |||
| BRXH (84) | |||
| BRXHG (EC44) | |||
| BRXLE (85) | |||
| BRXLG (EC45) | |||
| 7 | 条件付き分岐が実行されず、制御が次の命令へ渡された。 | 条件付き分岐に続くステートメント | |
| 8 | 無条件ブランチが実行されようとしている。 |
BC 15,x (47Fx) |
|
BRC 15,x (A7F4) |
|||
BRCL 15,x (C0F4) |
|||
| BSM (0B) |
アセンブラー・プログラムの「Source」ウィンドウに表示される情報は、以下の 2 つの表示方法のいずれかで見ることができます。STANDARD 表示方法の場合、アセンブラー・リストにあるすべての行が表示されます。この表示方法には、マクロ展開で生成された行が含まれます。 NOMACGEN 表示方法の場合、マクロ展開で生成された行は表示されません。このためこの表示方法は、PRINT NOGEN が有効になっている場合に生成されるアセンブラー・リストに似ています。
以下のコマンドを使用して、アセンブラー・プログラムに対して「Source」ウィンドウに出力される表示方法を制御できます。
アセンブラー・プログラムをデバッグするときには、次の一般的な制約事項が適用されます。
言語環境プログラム対応のアセンブラー・メインプログラムをデバッグする場合、以下の制約事項が適用されます。
言語環境プログラムのアセンブラー・プログラムのプロローグに明示的または暗黙的なブレークポイントを設定しようとする場合、次の制約事項が適用されます。
プログラムの開始時に NOPROMPT サブオプションを付けて TEST ランタイム・オプションを指定した場合、Debug Tool が後から CALL CEETEST または言語環境プログラム条件の発生によって開始されるときには、言語環境プログラムと非言語環境プログラムの両方のプログラムをデバッグでき、言語環境プログラムと非言語環境プログラムの両方のイベントを、Debug Tool を開始したエンクレーブおよび後続のエンクレーブで検出できます。より高いレベルのエンクレーブでは、非言語環境プログラムのプログラムのデバッグまたは非言語環境プログラムのイベントの検出はできません。 Debug Tool が開始されたエンクレーブから制御が戻った後は、非言語環境プログラムのプログラムをデバッグしたり、非言語環境プログラムのイベントを検出したりすることはできなくなります。
Debug Tool は命令をデータとして使用するコードをデバッグできません。 プログラムが 1 つ以上の命令をデータとして参照する場合、 結果は、Debug Tool の異常終了 (ABEND) を含めて予測不能となる可能性があります。 これは Debug Tool がブレークポイントを作成するために、命令を SVC で 置換することがあるためです。
例えば、Debug Tool は次のようなコードを正しく処理することができません。
Entry1 BRAS 15,0
NOPR 0
B Common
Entry2 BRAS 15,0
NOPR 4
Common DS 0H
IC 15,1(15)
このコードでは、IC は NOPR 命令の 2 番目のバイトを検査するために使用されます。 ただし、NOPR 命令が SVC で置換されてブレークポイントを作成する場合は、 値 0 も 4 も取得されず、ユーザー・プログラムで予期しない結果が発生する 可能性があります。
次のコーディング手法により、この問題を発生させなくすることができます。
方法 1 を使用する場合、先述の例を次のコードに変更することができます。
Entry1 BAL 15,*+L'*+2
DC H'0'
B Common
Entry2 BAL 15,*+L'*+2
DC H'4'
Common DS 0H
IC 15,1(15)
方法 2 を使用する場合、先述の例を次のコードに変更することができます。
Entry1 BRAS 15,0
DC X'0700'
B Common
Entry2 BRAS 15,0
DC X'0704'
Common DS 0H
IC 15,1(15)
Debug Tool は、2 種類の自己修正コード (検出可能および検出不能) を定義します。 検出可能な自己修正コードは、以下のいずれかを行うコードです。
Inst1 NOP Label1
MVI Inst1+1,X'F0' EQAModIn Inst1
Inst1 NOP Label1
LA R3,Inst1
MVI 0(R3),X'F0'これらの基準のいずれも満たさない自己修正コードは、検出不能として分類されます。
Debug Tool は、検出可能な自己修正コードを識別するとき、 マクロが生成した命令であることを示す桁の直前の桁に「X」をつけて、 ソース・ウィンドウに状態を示します。 このような命令にはブレークポイントも設定できず、STEP も命令で停止しません。
EQAMODIN マクロは Debug Tool のサンプル・ライブラリー (hlq.SEQASAMP) に付属しています。 このマクロは、検出不能な自己修正コードを検出可能にするために使用できます。 実行可能コードは生成されません。 代わりに、指定のオペランドを変更済みとして示すように、単に情報が SYSADATA ファイルに追加されます。 オペランドは、ラベル名または「*」(直後の命令が変更されたことを示す) のいずれかで指定できます。
検出不能な自己修正コードがプログラムに含まれていて、 それを組み込むコンパイル単位のデバッグ時にそのコードが命令を変更する場合、 結果は予測できず、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 |