Rational Developer for System z バージョン 7.6

アセンブラー・プログラムのデバッグ

デバッグ情報を使用してアセンブルされたプログラムをデバッグするときには、ほとんどの Debug Tool コマンドを使用できます。例外については、「Debug Tool リファレンスおよびメッセージ」に記載されています。アセンブラー・プログラムをデバッグする前に、アセンブラー・プログラムの準備の説明に従ってプログラムを準備してください。

SET ASSEMBLER と SET DISASSEMBLY コマンド

SET ASSEMBLER ONSET 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 セッション・パネル

下図の 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

ソース・ウィンドウに表示される情報は、アセンブラーによって生成されるリストの情報と同じです。ソース・ウィンドウには、以下の情報が表示されます。

 1  ステートメント番号
ステートメント番号は、EQALANGX プログラムが割り当てる番号です。この列で、ブレークポイントの設定とステートメントの識別を行います。

複数行に同じステートメント番号を割り当てることができる場合もあります。コメント、ラベル、およびマクロ呼び出しには、これらのステートメントに続くマシン・インストラクションと同じステートメント番号が割り当てられます。これらのステートメントには、CSECT 内で同じオフセットが割り当てられます。これにより、これらのいずれかの行にカーソルを移動し、PF6 を押すと、ブレークポイントを設定できます。このステートメントに達すると、マクロ呼び出しまたはマシン・インストラクションのいずれかが含まれているステートメント内の最初の行にフォーカスが設定されます。

 2 
オフセットの前のカラムにあるアスタリスクの意味は、その行が、現在限定対象としていないコンパイル単位の中に入っていることを示します。その行上に行ブレークポイントまたはステートメント・ブレークポイントを設定しようとする前に、SET QUALIFY CU compile_unit と入力し、compile_unit パラメーターには包含しているコンパイル単位の名前を指定します。
 3  offset
CSECT の開始からのオフセット。この列は、アセンブラー・リストの一番左の列に対応しています。
 4  object
命令のオブジェクト・コード。この列は、アセンブラー・リストの「Object Code」の列に対応しています。データ・フィールドのオブジェクト・コードは表示されません。
 5  変更された命令
この桁の「X」は、特定のポイントでプログラムによって変更された実行可能命令を示します。 このような命令にはブレークポイントを設定することも、STEP を実行することもできません。
 6  生成されたマクロ
この列の「+」は、マクロ展開によってその行が生成されることを示します。マクロ展開で生成された行は、標準的な表示方法でのみ現れてくるだけです。これらの行は、NOMACGEN 表示方法が有効になっていれば表示されません。
 7  ソース・ステートメント
オリジナルのソース・ステートメント。この列は、アセンブラー・リストの「Source Statement」の列に対応しています。

ここで述べた内容に関して詳しくは、以下のトピックを参照してください。

アセンブラー・プログラムの %PATHCODE 値

次の表に、現在のプログラム言語がアセンブラーの場合に、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)

STANDARD 表示方法と NOMACGEN 表示方法

アセンブラー・プログラムの「Source」ウィンドウに表示される情報は、以下の 2 つの表示方法のいずれかで見ることができます。STANDARD 表示方法の場合、アセンブラー・リストにあるすべての行が表示されます。この表示方法には、マクロ展開で生成された行が含まれます。 NOMACGEN 表示方法の場合、マクロ展開で生成された行は表示されません。このためこの表示方法は、PRINT NOGEN が有効になっている場合に生成されるアセンブラー・リストに似ています。

以下のコマンドを使用して、アセンブラー・プログラムに対して「Source」ウィンドウに出力される表示方法を制御できます。

アセンブラー・プログラムのデバッグにおける制約事項

アセンブラー・プログラムをデバッグするときには、次の一般的な制約事項が適用されます。

言語環境プログラムのアセンブラーの MAIN プログラムのデバッグにおける制約事項

言語環境プログラム対応のアセンブラー・メインプログラムをデバッグする場合、以下の制約事項が適用されます。

言語環境プログラムのアセンブラー・プログラムのプロローグにブレークポイントを設定する際の制約事項

言語環境プログラムのアセンブラー・プログラムのプロローグに明示的または暗黙的なブレークポイントを設定しようとする場合、次の制約事項が適用されます。

非言語環境プログラムのプログラムのデバッグにおける制約事項

プログラムの開始時に 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 種類の自己修正コード (検出可能および検出不能) を定義します。 検出可能な自己修正コードは、以下のいずれかを行うコードです。

これらの基準のいずれも満たさない自己修正コードは、検出不能として分類されます。

検出可能な自己修正アセンブラー・コードの処理

Debug Tool は、検出可能な自己修正コードを識別するとき、 マクロが生成した命令であることを示す桁の直前の桁に「X」をつけて、 ソース・ウィンドウに状態を示します。 このような命令にはブレークポイントも設定できず、STEP も命令で停止しません。

EQAMODIN マクロは Debug Tool のサンプル・ライブラリー (hlq.SEQASAMP) に付属しています。 このマクロは、検出不能な自己修正コードを検出可能にするために使用できます。 実行可能コードは生成されません。 代わりに、指定のオペランドを変更済みとして示すように、単に情報が SYSADATA ファイルに追加されます。 オペランドは、ラベル名または「*」(直後の命令が変更されたことを示す) のいずれかで指定できます。

検出不能な自己修正アセンブラー・コード

検出不能な自己修正コードがプログラムに含まれていて、 それを組み込むコンパイル単位のデバッグ時にそのコードが命令を変更する場合、 結果は予測できず、Debug Tool が異常終了 (ABEND) することもあります。 プログラムが命令を完全に置き換える自己修正コードを含み、そのコードを含むコンパイル単位をデバッグする場合、 結果が ABEND とはならない場合があります。 ただし、Debug Tool は命令のブレークポイントを見落としたり、削除時に無効なフック・アドレスを示すメッセージを表示したりする可能性があります。

次のコーディング技法を使用すると、検出不能な自己修正コードをデバッグするときの問題を最小にすることができます。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)