デバッグ情報を使用してアセンブルされたプログラムをデバッグするときには、ほとんどの 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 ********************************************************** IBM Debug Tool Version 11 Release 1 Mod 0 11/06/2010 4:11:41 PM 5655-W45: Copyright IBM Corp. 1992, 2010 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」ウィンドウに出力される表示方法を制御できます。
ロード・モジュールに再入不可のマークが付いていて、対応する削除を行わないで複数回ロードされた場合は、そのロード・モジュールの複数のコピーがメモリーに同時に存在します。通常、高水準言語プログラムにはデフォルトで再入可能のマークが付いているため、再入不可プログラムのデバッグは主にアセンブラー・プログラムのデバッグに適用されます。再入不可アセンブラー・プログラムをデバッグする場合、以下の状態では次のセクションに記載されている特別な考慮事項があります。
以下の説明はフルスクリーン・モードとライン・モードのデバッグのみに適用されます。リモート・デバッガーを使用する場合は、再入不可アセンブラーのデバッグをサポートするための対応する機能はありません。
以下のいずれかのコマンドを使用して再入不可ロード・モジュールのコンパイル単位のブレークポイントを操作する場合、そのコマンドはロード・モジュールのコンパイル単位の同じ名前を持つすべてのコピーに適用されます。
再入不可ロード・モジュールのコンパイル単位のローカル変数を参照するとき、そのロード・モジュールの複数のコピーがメモリー内に存在する場合、コマンドを適用するコンパイル単位のコピーを指定する必要があります。コンパイル単位のコピーを指定するには、最初に特定のコンパイル単位のアドレスを取得する必要があります。次のリストでは、特定のコンパイル単位のアドレスを取得できるいくつかの方法を説明します。
アドレスを取得したら、SET QUALIFY address; コマンドを入力します。ここで、address は指定した特定のコンパイル単位のアドレスです。
アセンブラー・プログラムをデバッグするときには、次の一般的な制約事項が適用されます。
言語環境プログラム対応のアセンブラー・メインプログラムをデバッグする場合、以下の制約事項が適用されます。
CICS で実行されている言語環境プログラム準拠のアセンブラー MAIN プログラムをデバッグするには、CICS Transaction Server バージョン 3.1 以降で実行する必要があります。
言語環境プログラムのアセンブラー・プログラムのプロローグに明示的または暗黙的なブレークポイントを設定しようとする場合、次の制約事項が適用されます。
プログラムの開始時に 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 は、その命令に関するブレークポイントを見逃したり、削除時に無効なフック・アドレスを示すメッセージを表示したりする場合があります。命令を変更するコードをステップスルーする と、移動される命令に、変更された命令の実行時に Debug Tool で障害を起こす原因となるブレークポイントが含まれる場合があります。
次のコーディング技法を使用すると、検出不能な自己修正コードをデバッグするときの問題を最小にすることができます。
| 命令 op-code によって定義された命令を変更するコード | DC によって定義された命令を変更するコード |
|---|---|
ModInst BC 0,Target
...
MVI ModInst+1,X'F0' |
ModInst DC X'4700',S(Target)
...
MVI ModInst+1,X'F0' |
| 命令を変更するコード | 命令を DC によって定義されたものと置き換える、その対応コード |
|---|---|
ModInst BC 0,Target ... MVI ModInst+1,X'F0' |
ModInst BC 0,Target ... MVC ModInst(4),NewInst ... NewInst DC X'47F0',S(Target) |
| 命令を変更するコード | EQAMODIN によってマークされた命令を置き換える、その対応コード |
ModInst BC 0,Target
...
MVI ModInst+1,X'F0' |
ModInst BC 0,Target
...
MVC ModInst(4),NewInst
...
EQAMODIN NewInst
NewInst BC 15,Target |