Rational Developer for System z バージョン 7.6

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

デバッグ情報なしでコンパイルまたはアセンブルされたプログラムをデバッグする場合は、逆アセンブリー表示を使用できます。逆アセンブリー表示を使用する場合、元のソース・プログラムのシンボル情報 (プログラム変数、ラベル、およびその他のメモリー・セクションへのシンボルによる参照など) は使用できません。 逆アセンブリー表示を使用するにはその前に、DYNDEBUG スイッチが ON でなければなりません。

デバッグしているプログラムについて完全に理解していない場合は、デバッグ作業の間、コンパイラーまたは高水準アセンブラー (HLASM) によって作成されたリスト 1 部を手元に用意しておくことをお勧めします。逆アセンブリー表示を使用する場合にプログラムが従わなければならない、特定のアセンブリー要件またはコンパイル要件はありません。

SET ASSEMBLER と SET DISASSEMBLY コマンド

SET ASSEMBLER ONSET DISASSEMBLY ON コマンドは、 いくつかの同じ機能を使用可能にします。ただし、どちらのコマンドを使用するかを決める前に、 デバッグする CU のタイプ (アセンブラー、逆アセンブリー、またはその両方) を考慮する必要があります。 使用するコマンドを決める際には、次のガイドラインが役立ちます。

アセンブラー CU をデバッグしていて、その後、逆アセンブリー CU をデバッグすることにした場合、 SET ASSEMBLER ON コマンドを入力した後 SET DISASSEMBLY ON コマンドを入力することができます。

逆アセンブリー表示の機能

逆アセンブリー表示を使用すると、以下のタスクを実行することができます。

逆アセンブリー表示の開始

逆アセンブリー表示を開始するには、次の操作を行ってください。

  1. SET DISASSEMBLY ON コマンドを入力する。
  2. デバッグ・データを含まないプログラムを開く。言語設定が Debug Tool によって Disassem に変更され、アセンブラー・コードがソース・ウィンドウに表示されます。

デバッグ・データを含むプログラムを入力した場合、言語設定は変更されず、逆アセンブリー・コードはソース・ウィンドウに表示されません。

逆アセンブリー表示

逆アセンブリー表示を介してプログラムをデバッグする場合は、ソース・ウィンドウに逆アセンブリー命令が表示されます。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
 A  接頭部域
CU または CSECT の開始からのオフセットを表示。
 B  列 1-8
メモリー内のマシン・インストラクションのアドレスを表示。
 C  列 13-26
メモリー内のマシン・インストラクションを表示。
 D  列 29-32
命令コードのニーモニック、または命令コードが無効な場合は ???? を表示。
 E  列 35-70
逆アセンブルされたマシン・インストラクションの表示。

逆アセンブリー表示を使用する場合、ソース・エリア内に表示される逆アセンブリー命令は正確であるとは限りません。これは、常に命令からデータを区別できるとは限らないためです。不正確な場合に備えて、コンパイラーまたは 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 は、その命令に関するブレークポイントを見逃したり、 削除時に無効なフック・アドレスを示すメッセージを表示したりする場合があります。

次のコーディング手法により、自己修正コードのデバッグ時の問題を最小限にできます。

  1. 命令の一部を変更しないでください。代わりに、命令を置き換える。 以下の表で、コーディング手法を比較します。
    命令を変更するコーディング 命令を置き換えるコーディング
    ModInst  BC 0,Target
       ...
       MVI ModInst+1,X'F0'
    ModInst  BC 0,Target
       ...
       MVC ModInst(4),NewInst
       ...
    NewInst  BC 15,Target
  2. 実行可能命令ではなく、DC 命令を使用して変更される命令を指定します。例えば、命令 MVC ModInst(4),NewInst ではなく、命令 ModInst DC X'4700',S(Target) を使用します。

逆アセンブリー表示でのレジスターの表示および変更

LIST REGISTERS コマンドを使用することにより、すべてのレジスターの内容を表示することができます。個々のレジスターの内容を表示するには、LIST Rx コマンドを使用してください。この場合、x はここのレジスター番号を表します。レジスター上にカーソルを置き LIST ファンクション・キーを押すことによっても、個々のレジスターの内容を表示することができます。デフォルトの LIST ファンクション・キーは、PF4 です。レジスターの内容は、アセンブラーの割り当てステートメントで変更できます。

逆アセンブリー表示でのストレージの表示および変更

LIST STORAGE コマンドを使用することにより、ストレージの内容を表示することができます。STORAGE コマンドを使用することにより、ストレージの内容を変更することができます。

また、アセンブラー・ステートメントでもストレージの表示や変更を行えます。 例えば、レジスター 2 に入ったアドレスにある 4 バイトをゼロに設定するには、 次のコマンドを入力します。

R2-> <4>=0

この 4 バイトがゼロに設定されたことを確認するには、次のコマンドを入力します。

LIST R2->

逆アセンブリー表示に表示されているプログラムの変更

SET QUALIFY コマンドを使用して、逆アセンブリー表示に表示されているプログラムを変更することができます。例えば、プログラム ABC のデバッグ中に、プログラム BCD にブレークポイントを設定する必要があるとします。

  1. この場合、コマンド行に SET QUALIFY CU BCD を入力します。Debug Tool は、プログラム BCD の逆アセンブリー命令を表示するようソース・ウィンドウを変更します。
  2. ブレークポイントを設定したい命令がみつかるまで、ソース・ウィンドウをスクロールしてください。
  3. プログラム ABC の次に実行する命令の個所に戻るには、SET QUALIFY RESET コマンドを発行してください。

逆アセンブリー表示の制約事項

逆アセンブル・プログラムをデバッグする場合、以下の制約事項が適用されます。

逆アセンブリー表示を使用してプログラムをデバッグする場合、以下のいずれの状態においても Debug Tool は、アプリケーションを停止することができません。

アプリケーションは、Debug Tool が有効な保存域の逆チェーンを検出するまで実行されます。


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

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