このチュートリアルでは、デバッガの基本機能を紹介し、さまざまなデバッグ方式を説明します。 ここでは、簡単なシナリオを使用して、ランタイムエラーの分析やプログラム実行の制御を行うためのデバッガの使用方法を示します。
セッション 1~5 は、順番どおりに実行することが重要です。
注意:
Natural でのプログラミングに慣れている必要があります。
セッション 1 を開始する前に、すべてのサンプルプログラム(DEBUG1P および DEBUG2P)およびサンプルサブプログラム(DEBUG1N、DEBUG2N、DEBUG3N、および DEBUG4N)を作成する必要があります。これらのサンプルは、このチュートリアルの後にある「サンプルソース」セクションに記載されています。 システムコマンド STOW
で、これらのオブジェクトを保存し、カタログします。
デバッガを使用して、Natural オブジェクトの実行フローを特定のデバッグイベントで中断し、中断したオブジェクトの現在のステータスの情報を取得できます。例えば、次に実行されるステートメント、変数の値、および呼び出されるオブジェクトの階層構造(プログラムレベル)などを取得できます。
プログラムを中断するには、基本的に次の 2 つの主な手順を実行して、デバッガに制御を渡す必要があります。
システムコマンド TEST ON
でデバッガを有効にします。
これによりデバッガは、Natural ランタイムシステムによって実行される各ステートメントの制御を受け取ることができます。
実行される Natural オブジェクトに、1 つ以上のデバッグエントリ(ブレイクポイントとウォッチポイント)を設定します。
これによりデバッガは、Natural ランタイムシステムから制御を受け取り、プログラムの実行を中断するタイミングを判断できます。
Natural エラーが発生した場合は、プログラムの実行が必ず中断されます。 この場合は、デバッグエントリが不要となり、自動的に制御がデバッガに移動します。
考えられるすべてのプログラム中断の概要は、次のとおりです。
プログラム中断 | 説明 |
---|---|
ブレイクポイント | Natural オブジェクトのステートメント行でプログラムの中断を引き起こします。
デバッガは、ブレイクポイントが設定されたステートメント行が実行されるたびに、プログラム実行を中断します。つまり、この行に含まれるステートメントが処理される前に中断します。 |
ウォッチポイント | Natural オブジェクトの変数でプログラムの中断を引き起こします。
デバッガは、ウォッチポイントが設定された変数の内容が変化するたびに、プログラム実行を中断します。つまり、この変数を参照するステートメントが処理された後に中断します。 |
ステップモード | プログラム実行中にオブジェクトをステップ実行します。
ステップモードはデバッガコマンドにより開始されます。デバッガはその前に、ブレイクポイントまたはウォッチポイントにより制御を受け取っている必要があります。 ステップモードでは、このオブジェクトに含まれる各実行ステートメントが処理される前に、デバッガがプログラム実行を中断します。 |
Natural エラー | 自動的にプログラムの中断を引き起こします。 |
このセッションでは、プログラムの実行中に発生する Natural エラーの調査方法を説明します。
Natural エラーをシミュレートするには
NEXT プロンプトから DEBUG1P を実行します。
次の Natural エラーメッセージが表示されます。「DEBUG1N 0180 NAT0954 プログラムの実行中に異常終了 S0C7 が発生しました。
」
このメッセージは、サブプログラム DEBUG1N の行 180(BONUS := SALARY * PERCENT / 100
)を指しています。 これは、参照された 1 つ以上の変数に対して、誤った値が返されたことを示します。 ただし、この時点では、これが問題の本当の原因を示しているのではありません。また、変数値がデータベースから取得されている場合(典型的な例は従業員レコードです)は、原因の特定が困難である可能性があります。
デバッガを有効にして、さらに問題を調査するには
NEXT プロンプトで次のように入力します。
TEST ON
メッセージ「Test mode started.
」は、デバッガが有効であることを示します。
注意:TEST ON
は、現在のセッション中、または「TEST OFF
」を入力してデバッガを無効にするまでは、有効なままです。
再び、NEXT プロンプトから DEBUG1P を実行します。
次の例のような[Debug Break]ウィンドウが表示されます。
+------------------- Debug Break -------------------+ | Break by ABEND S0C7 at NATARI2+2A4-4 (NAT0954) | | at line 180 in subprogram DEBUG1N (level 2) | | in library DEBUG in system file (10,32). | | | | G Go | | L List break | | M Debug Main Menu | | N Next break command | | R Run (set test mode OFF) | | S Step mode | | V Variable maintenance | | | | Code .. G | | | | Abnormal termination S0C7 during program execution| | PF2=Step,PF13=Next,PF14=Go,PF15=Menu,PF17=SkipS | +---------------------------------------------------+ |
Natural エラーが発生するため、自動的に制御がデバッガに移動し、[Debug Break]ウィンドウが表示されます。
エラーの発生場所に関する詳細情報が、ウィンドウの最上部に表示されます。詳細情報とは、Natural ニュークリアスのモジュール(NATARI2
)(Software AG 技術サポートに連絡する際に役立ちます)、オブジェクトのタイプ(subprogram
)、ライブラリ(DEBUG
)とデータベース ID、およびシステムファイルのファイル番号(10,32
)です。
[Debug Break]ウィンドウには、使用可能なデバッガの機能も表示されます。例えば、プログラム実行の継続( または )、デバッガの管理メニューの呼び出し( )、またはステップモードの有効化などの機能を使用できます。 機能を実行するには、該当するファンクションコードまたは PF キーを使用します。
誤ったステートメント行を調べるには
[Code]フィールドで、デフォルトエントリ「G
」の代わりに「L
」を入力し、 機能を実行します。
DEBUG1N のソースが表示されます。
13:48:54 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | last line __ 0180 BONUS := SALARY * PERCENT / 100 | * NAT0954 * __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | __ 0210 END | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
last line
は、行 170 に含まれるステートメントが、正常に実行された最後の行であることを示しています。
問題を引き起こした行 180 のステートメントが強調表示され、* NAT0954 *
という注記が付いています。
これは、エラーの原因が変数 SALARY
または PERCENT
の内容であることを示します。 PERCENT
は正常に初期化されているため、原因はおそらく、SALARY
です。
SALARY
の内容をチェックするには
コマンド行で、次のように入力します。
DIS VAR SALARY
次の例のような[Display Variable]画面が、変数 SALARY
について表示されます。
18:59:51 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Variable (Alphanumeric) - Object DEBUG1N Name ...... EMPLOYEE.SALARY Fmt/Len ... P 7.2 Type ...... parameter Index ..... Range ..... Position .. Contents .. Command ===> Variable contains invalid data. Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Mod Flip Li Br Alpha Hex Canc |
メッセージ「Variable contains invalid data.
」は、変数の内容が空白で、変数のフォーマットに該当しないことを示します。 これは、次の手順で説明するように、変数の内容を 16 進表現で表示すると、明らかになります。
PF11 キー(Hex)を押して、変数の内容を 16 進数で表示します。
次の例のような画面が表示されます。
11:13:33 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Variable (Hexadecimal) - Object DEBUG1N Name ...... EMPLOYEE.SALARY Fmt/Len ... P 7.2 Type ...... parameter Index ..... Range ..... Position .. Contents .. 4040404040 Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Mod Flip Li Br Alpha Hex Canc |
16 進値は、変数がパック型数値フォーマットではなく、そのために、プログラム実行中に計算エラーが発生することを示しています。 DEBUG1P が DEBUG1N に誤った SALARY
の値を提供していることは明らかです。
ヒント:
表示を英数字表現に戻すには、PF10 キー(Alpha)を押します。
コマンド行で、次のように入力します。
GO
コマンド GO
を使用すると、制御がデバッガから Natural ランタイムシステムに戻り、プログラムの終了または次のデバッグイベントまでプログラム実行が継続されます。 この場合は、他にデバッグイベントは発生せず、すでに知られている Natural エラーメッセージを示す
NEXT プロンプトが表示されます。
オブジェクトソースで SALARY
を修正するには
プログラムエディタで DEBUG1P を開き、SALARY := 99000
に入力されているコメント記号(*)を削除します。
システムコマンド STOW
で、プログラムを保存し、カタログします。
DEBUG1P を実行します。
TEST ON
が設定されたままですが、デバッガはプログラムを中断しません。 プログラムが正常に実行され、次のレポートを出力します。
Page 1 07-09-06 15:28:06 EMPLOYEE RECEIVES: 100800.00 PLUS BONUS OF: 3465.00 NEXT LIB=DEBUG |
特定のステートメント行にブレイクポイントを設定して、このステートメント行でプログラム実行を中断することができます。
DEBUG1N のステートメント行にブレイクポイントを設定するには
NEXT プロンプトで次のように入力します。
TEST SET BP DEBUG1N 170
メッセージ「Breakpoint DEBUG1N0170 set at line 170 of object DEBUG1N.
」は、DEBUG1N0170
という名前のブレイクポイントが、DEBUG1N サブプログラムのステートメント行 170 に設定されていることを示しています。
注意:
DEBUG1P を実行します。
これで、新しいブレイクポイントが設定されたステートメント行で、デバッガがプログラム実行を中断します。 [Debug Break]ウィンドウが表示されます。
+------------------- Debug Break -------------------+ | Break by breakpoint DEBUG1N0170 | | at line 170 in subprogram DEBUG1N (level 2) | | in library DEBUG in system file (10,32). | | | | G Go | | L List break | | M Debug Main Menu | | N Next break command | | R Run (set test mode OFF) | | S Step mode | | V Variable maintenance | | | | Code .. G | | | | | | PF2=Step,PF13=Next,PF14=Go,PF15=Menu,PF17=SkipS | +---------------------------------------------------+ |
このウィンドウには、ブレイクポイントの名前、対応するステートメント行とオブジェクト、およびこのオブジェクトを含むライブラリが表示されます。 また、サブプログラム DEBUG1N の動作レベルも表示されます。
[Debug Break]ウィンドウが示すステートメントを表示するには
機能を実行します。
DEBUG1N のソースが[List Object Source]画面に表示されます。
11:36:45 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | last line __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | DEBUG1N0170 __ 0180 BONUS := SALARY * PERCENT / 100 | __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | __ 0210 END | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
[Debug Break]ウィンドウに示されたステートメント行 170 が強調表示されています。 [Message]列には、このステートメント行に設定されたブレイクポイントの名前(DEBUG1N0170
)と、最後に実行されたステートメント行(last line
が示す行 160)が表示されます。
注意:ブレイクポイントは、ブレイクポイントが設定されたステートメントが処理される前にプログラム実行を中断します。
[List Object Source]画面には、現在のオブジェクトに関する詳細情報を表示するためにいくつかのダイレクトコマンドを入力できます。 例えば、次の手順で説明するように、すべての変数を表示できます。
DEBUG1N に含まれる変数のリストを表示するには
コマンド行で、次のように入力します。
DIS VAR
次のような[Display Variables]画面が表示されます。
11:06:13 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Variables (Alphanumeric) - Object DEBUG1N All Co Le Variable Name F Leng Contents Msg. 1 EMPLOYEE __ 2 NAME A 20 MEIER __ 2 ENTRYDATE D 1989-01-01 __ 2 SALARY P 7.2 99000.00 __ 2 BONUS P 7.2 *** invalid data *** __ 1 TARGETDATE D 2009-01-01 __ 1 DIFFERENCE P 3.2 20.00 __ 1 PERCENT P 2.2 3.50 Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Zoom Flip - + Li Br Alpha Hex Canc |
この画面には、DEBUG1N で定義されたすべての変数のリストが表示されます。 BONUS
の invalid data
(無効データ)の注釈は無視できます。 この場合は、BONUS
がターゲットオペランドとしてのみ使用されているため、正しく初期化されている必要はありません。 ただし、別のデバッガコマンドを実行するには、次の手順で BONUS
の内容を変更してください。
BONUS
の内容をチェックして変更するには
BONUS
の隣の[Co]列に、次のように入力します。
MO
または:
コマンド行で、次のように入力します。
MOD VAR BONUS
次のような[Modify Variable]画面が表示されます。
11:29:50 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Modify Variable (Alphanumeric) - Object DEBUG1N Name ...... EMPLOYEE.BONUS Fmt/Len ... P 7.2 Type ...... parameter Index ..... Range ..... Position .. 1 Contents .. ___________ Command ===> Variable contains invalid data. Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Save Flip Li Br Alpha Hex Canc |
16 進表示を使用すると、変数がパック型数値のフォーマットでないことを確認できます。 表示を英数字表現に戻すには、PF10 キー(Alpha)を押します。
[Contents]フィールドに、12345.00
などのパック型数値フォーマットの値を入力し、PF5 キー(Save)を押します。
次の例のような画面が表示されます。
11:50:00 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Variable (Alphanumeric) - Object DEBUG1N Name ...... EMPLOYEE.BONUS Fmt/Len ... P 7.2 Type ...... parameter Index ..... Range ..... Position .. Contents .. 12345.00 Command ===> Variable BONUS modified. Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Mod Flip Li Br Alpha Hex Canc |
[Contents]の変更を確認するメッセージが表示されます。
PF9 キー(Li Br)または PF3 キー(Exit)を押します。
[List Object Source]画面が表示されます。
コマンド行で、次のように入力します。
GO
デバッガが Natural ランタイムシステムに制御を戻し、これ以上、デバッグイベントは発生しないため、DEBUG1P の実行が終了します。 プログラムが生成したレポートが出力されます。
Page 1 07-09-06 10:02:51 EMPLOYEE RECEIVES: 100800.00 PLUS BONUS OF: 3465.00 NEXT LIB=DEBUG |
次のセッションへ進む前に、NEXT プロンプトで次のように入力して、現在のすべてのブレイクポイントを削除します。
TEST DEL BP * *
すべてのブレイクポイント(この場合は 1 つのブレイクポイントのみ)が削除されることを確認するメッセージが表示されます。
DEBUG1P および DEBUG1N は、1 名の従業員に支払われるボーナスと給与の計算を実行します。 複数の従業員レコードが処理される場合は、変数 BONUS
が正しく更新されたかどうかをテストすることをお勧めします。 そのためには、この変数にウォッチポイントを設定します。 ウォッチポイントを使用すると、指定した変数の内容が変更されたときに、デバッガがプログラム実行を中断できます。
変数 BONUS
にウォッチポイントを設定するには
NEXT プロンプトで次のように入力します。
TEST SET WP DEBUG1N BONUS
メッセージ「Watchpoint BONUS set for variable EMPLOYEE.BONUS.
」は、DEBUG1N サンプルサブプログラムの変数 BONUS
にウォッチポイントが設定されたことを示しています。
注意:
TEST
を省略する必要があります。 例えば、「TEST SET WP DEBUG1N BONUS
」ではなく、「SET WP DEBUG1N BONUS
」のみを入力します。
NEXT プロンプトから DEBUG1P を実行します。
デバッガは、新しいウォッチポイントでプログラム実行を中断し、[Debug Break]ウィンドウを呼び出します。
+------------------- Debug Break -------------------+ | Break by watchpoint BONUS | | at line 180 in subprogram DEBUG1N (level 2) | | in library DEBUG in system file (10,32). | | | | G Go | | L List break | | M Debug Main Menu | | N Next break command | | R Run (set test mode OFF) | | S Step mode | | V Variable maintenance | | | | Code .. G | | | | | | PF2=Step,PF13=Next,PF14=Go,PF15=Menu,PF17=SkipS | +---------------------------------------------------+ |
このウィンドウは、行 180 でウォッチポイントが検出されたことを示します。 この行には、変数 BONUS
を処理するステートメントが含まれています。
デバッガは、BONUS
のステートメントが処理された後にプログラム実行を中断しています。 デバッガが、変数の内容が変更されたことを認識できたのは、処理された後のみであるためです。
機能を実行します。
[List Object Source]画面は、次の例のように表示されます。
16:24:46 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | DEBUG1N0170 __ 0180 BONUS := SALARY * PERCENT / 100 | BONUS __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | __ 0210 END | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
変数 BONUS
を参照するステートメントが強調表示され、[Message]列には、この変数に設定されたウォッチポイントの名前が表示されます。
BONUS
の変更をチェックするには
コマンド行で、次のように入力します。
DIS VAR BONUS
[Display Variable]画面が表示され、[Contents]フィールドに 3465.00
という値が示されます。 これは、変数 BONUS
の内容が変更されたことを表します。
PF3 キー(Exit)を押して、[List Object Source]画面に戻ります。
SALARY
の変更をチェックするには
この後の手順で変数 SALARY
の内容をテストするには、行 200 の[Co]列に次のように入力して、SALARY
にブレイクポイントを設定します。
SE
[List Object Source]画面では、SET BP
ダイレクトコマンドの代わりに、SE
などの便利な行コマンドも使用できます。
[Message]列は、ブレイクポイント(BP
)が行 200 に設定されていることを示しています。
17:55:58 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | DEBUG1N0170 __ 0180 BONUS := SALARY * PERCENT / 100 | BONUS __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | BP set __ 0210 END | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
コマンド行で、次のように入力します。
GO
[Debug Break]ウィンドウが表示されます。
+------------------- Debug Break -------------------+ | Break by breakpoint DEBUG1N0200 | | at line 200 in subprogram DEBUG1N (level 2) | | in library DEBUG in system file (10,32). | | | | G Go | | L List break | | M Debug Main Menu | | N Next break command | | R Run (set test mode OFF) | | S Step mode | | V Variable maintenance | | | | Code .. G | | | | | | PF2=Step,PF13=Next,PF14=Go,PF15=Menu,PF17=SkipS | +---------------------------------------------------+ |
[List break]機能を実行します。
[List Object Source]画面は、次の例のように表示されます。
10:49:31 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | DEBUG1N0170 __ 0180 BONUS := SALARY * PERCENT / 100 | last line __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | DEBUG1N0200 __ 0210 END | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
これはブレイクポイントであるため、SALARY
を参照(および更新)するステートメントは、まだ実行されていません。 したがって、変数の内容は変更されていません。
コマンド行に、DIS VAR SALARY
を入力して、SALARY
の内容が変更されていないことを確認します。
変数画面を見ると、SALARY
の値が、DEBUG1P で割り当てられた初期値である 99000
のままであることがわかります。
更新された変数の内容を表示するには、次のいずれかの方法を選んで、次のステートメントに進みます。
コマンド行で、次のように入力します。
STEP
または:
PF2 キー(Step)を押します。
次の例のような画面が表示されます。
13:38:24 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG1N Bottom of data Co Line Source Message __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | __ 0160 DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 | __ 0170 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPAN | DEBUG1N0170 __ 0180 BONUS := SALARY * PERCENT / 100 | __ 0190 END-IF | __ 0200 SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREA | last line __ 0210 END | step mode Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
1 行スキップして、行 200 にある次の実行ステートメントを処理し、SALARY
を更新しました。 [Message]列は、ステップモードが設定されていることを示しています。 ステップモードでは、次の実行ステートメントまで、デバッガがプログラム実行を継続します。
コマンド行に DIS VAR SALARY
を入力して、変数の内容をチェックします。
[Display Variable]画面が表示され、[Contents]フィールドに 100800.00
という値が示されます。 これは、変数 SALARY
の内容が変更されたことを示しています。
コマンド行で、次のように入力します。
GO
デバッガが Natural ランタイムシステムに制御を戻し、これ以上、デバッグイベントは発生しないため、DEBUG1P の実行が終了します。 プログラムが生成したレポートが出力されます。
このセッションでは、さまざまなデバッグ方法について説明します。これらの方法を使用すると、多数のオブジェクトを含む複雑な Natural アプリケーションへの理解を深め、全体の把握と制御を向上させることができます。
このセッションでは最初に、アプリケーションの論理的な流れをステートメントレベルで分析する手順を説明します。 そして、ブレイクポイントを使用して、プログラムの実行順序を調べる方法を示します。
このセッションでの手順の説明は、簡単な(しかも、十分に実行できる)サンプルアプリケーションに基づいています。このアプリケーションは、1 つのプログラム(DEBUG2P)と 3 つのサブプログラム(DEBUG2N、DEBUG3N、DEBUG4N)で構成されています。
プログラムの先頭または末尾にブレイクポイントを設定するには
NEXT プロンプトに次のように入力して、DEBUG2P にブレイクポイントを設定します。
TEST SET BP DEBUG2P BEG
メッセージ「Breakpoint DEBUG2P-BEG set at line BEG of object DEBUG2P.
」は、DEBUG1N にブレイクポイントが設定されていることを示しています。
特定の行番号でなく、キーワード BEG
を使用すると、プログラムの先頭、つまり、プログラムで実行される最初のステートメントにブレイクポイントが設定されます。 例えば、INIT
節が使用される場合の DEFINE DATA
ステートメントにも、ブレイクポイントを設定できます。こうすると、プログラムがカタログされるときに、実行ステートメントが生成されます。
ヒント:
また、キーワード END
を指定して、実行される最後のステートメントにブレイクポイントを設定することもできます。 最後のステートメントは、END
ステートメントだけでなく、FETCH
または CALLNAT
ステートメントである場合があります。
DEBUG2P を実行します。
[Debug Break]ウィンドウが表示されます。
+------------------- Debug Break -------------------+ | Break by breakpoint DEBUG2P-BEG | | at line 130 in program DEBUG2P (level 1) | | in library DEBUG in system file (10,32). | | | | G Go | | L List break | | M Debug Main Menu | | N Next break command | | R Run (set test mode OFF) | | S Step mode | | V Variable maintenance | | | | Code .. G | | | | | | PF2=Step,PF13=Next,PF14=Go,PF15=Menu,PF17=SkipS | +---------------------------------------------------+ |
これで、プログラムに設定された最初のブレイクポイントで、制御がデバッガに移動します。
NAME := 'MEIER'
でデバッガに制御が移動することを確認します。
アプリケーションをステップ実行するには
[List Object Source]画面で、PF2 キー(Step)を押すか、コマンド行に STEP
を入力して、ステップモードを設定します。
実行される最後の行には、last line
という注記が付いています。 実行される次のステートメントは強調表示され、step mode
という注記が付いています。
ヒント:
デバッガを各ステートメントで停止させずに、アプリケーションをより短時間でステップ実行するには、STEP
コマンドで、STEP 2
または STEP 10
のように、スキップするステートメントの数を指定します。
CALLNAT
ステートメントに step mode
という注記が付けられるまで、PF2 キー(Step)を繰り返し押します。
さらに PF2 キー(Step)を押して、CALLNAT
を実行します。
呼び出されたサブプログラム DEBUG2N が表示されます。ここでは、実行される次のステートメントが強調表示されています。
11:59:19 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Object Source - Object DEBUG2N Top of data Co Line Source Message __ 0010 ** SUBPROGRAM DEBUG2N: CALLS 'DEBUG3N' AND 'DEBUG4N'FOR | __ 0020 ******************************************************* | __ 0030 DEFINE DATA | step mode __ 0040 PARAMETER | __ 0050 1 EMPLOYEE | __ 0060 2 NAME (A20) | __ 0070 2 NUMCHILD (N2) | __ 0080 2 ENTRYDATE (D) | __ 0090 2 SALARY (P7.2) | __ 0100 2 BONUS (P7.2) | __ 0110 LOCAL | __ 0120 1 TARGETDATE (D) INIT <D'2009-01-01'> | __ 0130 1 DIFFERENCE (P3.2) | __ 0140 1 PERCENT (P2.2) INIT <3.5> | __ 0150 END-DEFINE | Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Step Exit Last Scan Flip - + Li Br < > Canc |
この方法を使用せずに、コマンド行に STEP SKIP
を入力して、CALLNAT
をスキップすることもできます。
この場合は、呼び出すプログラム DEBUG2 のステートメントだけがステップ実行され、呼び出されるサブプログラムの各ステートメントは実行されません。
オブジェクトの実行レベルを表示するには
DEBUG2N の[List Object Source]画面で、コマンド行に次のように入力します。
OBJCHAIN
次のような[Break Information]画面が表示されます。
13:45:34 ***** NATURAL TEST UTILITIES ***** 2007-09-06 - Break Information - No GDA active for the current program. Break by step mode at line 30 in subprogram DEBUG2N (level 2) in library DEBUG in system file (10,32). |
すでに知られているオブジェクト情報の他に、プログラムが GDA(グローバルデータエリア)を参照するかどうかがこの画面に示されます。
Enter キーを押して、1 ページ下方にスクロールします。
次の例のような画面が表示されます。
13:46:34 ***** NATURAL TEST UTILITIES ***** 2007-09-06 - Current Object Chain - Level Name Type Line Library DBID FNR 2 DEBUG2N Subprogram 0 DEBUG 10 32 1 DEBUG2P Program 170 DEBUG 10 32 |
この画面は、オブジェクトが実行される動作レベルを示します。サブプログラム DEBUG2N はレベル 2 で、プログラム DEBUG2P(これがサブプログラムを呼び出します)はその上位のレベル 1 で実行されます。
Enter キーを押します。
[List Object Source]画面が表示されます。
コマンド行で、次のように入力します。
GO
デバッガが Natural ランタイムシステムに制御を戻し、これ以上、デバッグイベントは発生しないため、DEBUG2P の実行が終了します。 プログラムが生成したレポートが出力されます。
Page 1 07-09-06 10:04:21 EMPLOYEE RECEIVES: 99300.00 PLUS BONUS OF: 3565.00 NEXT LIB=DEBUG |
NEXT プロンプトで次のように入力して、現在設定されているすべてのブレイクポイントを削除します。
TEST DEL BP * *
すべてのブレイクポイントが削除されることを確認するメッセージが表示されます。
プログラム実行に続くブレイクポイントを設定するには
NEXT プロンプトで次のように入力します。
TEST SET BP ALL BEG
メッセージ「Breakpoint ALL-BEG set at line BEG of object ALL.
」が表示されます。
これは、実行される各オブジェクトの最初の実行ステートメントにブレイクポイントを設定したことを示します。
DEBUG2P を実行します。
DEBUG2P の[Debug Break]ウィンドウが表示されます。
関数を繰り返し実行します。
[Debug Break]ウィンドウに表示されます(最初に DEBUG2N、次に DEBUG3N と DEBUG4N)。 したがって、どのオブジェクトが、プログラム実行中のどの時点で呼び出されるかを簡単に判定できます。 また、各オブジェクトに対して、[Debug Break]ウィンドウのメニュー機能を適用できます。
を実行するたびに、次に呼び出されるオブジェクトがNEXT プロンプトが表示されたら、次のように入力して、現在設定されているすべてのブレイクポイントを削除します。
TEST DEL BP * *
すべてのブレイクポイントが削除されることを確認するメッセージが表示されます。
デバッガを使用して、呼び出されるオブジェクトと、それらが呼び出される頻度の統計情報を表示できます。 さらに、実行されるステートメントと、その実行頻度を表示できます。
プログラム実行中に呼び出されるオブジェクトがどれかをチェックするには
NEXT プロンプトで次のように入力します。
TEST SET CALL ON
メッセージ「Call statistics started.
」は、統計機能が有効であることを示しています。
DEBUG2P を実行します。
デバッガは、実行されるすべてのオブジェクト呼び出しをログに記録します。その後、プログラムで生成されたレポートが出力されます。
NEXT プロンプトで次のように入力します。
TEST DIS CALL
次のような[Display Called Objects]画面が表示されます。
10:43:47 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Called Objects - Object All Object Library Type DBID FNR S/C Ver Cat Date Time Calls *_______ DEBUG___ DEBUG2P DEBUG Program 10 32 S/C 4.2 2007-08-30 13:48 1 DEBUG2N DEBUG Subprogram 10 32 S/C 4.2 2007-08-30 13:48 1 DEBUG3N DEBUG Subprogram 10 32 S/C 4.2 2007-08-30 13:48 1 DEBUG4N DEBUG Subprogram 10 32 S/C 4.2 2007-08-30 13:48 1 Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Last Flip + Canc |
画面には、実行されるすべてのオブジェクトのリストが表示されます。ここでは、呼び出しプログラム(DEBUG2P)および、呼び出されたその他のすべてのオブジェクト(DEBUG2N、DEBUG3N、DEBUG4N)が表示されています。 また、各オブジェクトが呼び出される頻度(CALLS
)、呼び出されるオブジェクトのタイプ、オブジェクトが格納される場所と Natural バージョン、ソースオブジェクトとカタログ化オブジェクトがあるかどうか、オブジェクトがいつカタログされたかも表示されます。
NEXT プロンプトが表示されるまで、PF3 キー(Exit)または PF12 キー(Canc)を押します。
プログラム実行中に実行されるステートメントがどれかをチェックするには
NEXT プロンプトで次のように入力します。
TEST SET XSTAT COUNT
メッセージ「Statement execution counting started for library/object */*.
」は、現在のライブラリに含まれるすべてのオブジェクト、およびこのライブラリに連結されたすべての steplib に対して統計機能が有効であることを示しています。
DEBUG2P を実行します。
デバッガは、プログラムが処理するすべてのステートメントをログに記録します。その後、プログラムで生成されたレポートが出力されます。
NEXT プロンプトで次のように入力します。
TEST DIS XSTAT
次の例のような[List Statement Execution Statistics]画面が表示されます。
11:39:10 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - List Statement Execution Statistics - Object All Co Object Library Type DBID FNR Obj.Called Exec Exec % Total No. *_______ *_______ n Times able uted Executions __ DEBUG2P DEBUG Program 10 32 1 8 8 100 8 __ DEBUG2N DEBUG Subprogram 10 32 1 8 8 100 8 __ DEBUG3N DEBUG Subprogram 10 32 1 2 2 100 2 __ DEBUG4N DEBUG Subprogram 10 32 1 10 7 70 7 Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Last Flip - + Canc |
この画面には、呼び出しの数(Obj. Called n Times
)、実行ステートメントの数(Exec able
)、実行されたステートメントの数(Executed
)、実行ステートメントの総数に対する、実行されたステートメントのパーセンテージ(%
)、および実行されたステートメントの総数(Total No. Executions
)のリストが含まれます。
DEBUG4N
の隣の[Co]列に、次のように入力します。
DS
次のような統計画面が表示されます。
12:11:19 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Display Statement Lines - Object DEBUG4N Line Source Count 0010 ** SUBPROGRAM 'DEBUG4N': CALCULATES SPECIAL SALARY INCREASE 0020 ************************************************************ 0030 DEFINE DATA 0040 PARAMETER 0050 1 SALARY (P7.2) 0060 END-DEFINE 0070 DECIDE FOR FIRST CONDITION 1 0080 WHEN SALARY < 50000 1 0090 SALARY := SALARY + 1800 not executed 0100 WHEN SALARY < 70000 1 0110 SALARY := SALARY + 1200 not executed 0120 WHEN SALARY < 90000 1 0130 SALARY := SALARY + 600 not executed 0140 WHEN NONE 1 0150 SALARY := SALARY + 300 1 Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Last Flip + Canc |
この画面は、ステートメントが実行された頻度と、処理されなかった実行ステートメントを示します。
このセクションでは、デバッガの使用に関するその他のヒントを説明します。
カタログ化オブジェクトがソースオブジェクトと正確には対応しない場合は、デバッグエラーが発生する可能性があります。 ソースオブジェクトとカタログ化オブジェクトが確実に対応するようにするには、これらをシステムコマンド STOW
で保存し、カタログします。
詳細については、「動作要件」セクションを参照してください。
現在のセッションで設定されているブレイクポイントとウォッチポイントをデバッグ環境として保存できます。今後のセッションでは、この環境をロードして使用できます。 これは、同じデバッグエントリを含むアプリケーションを繰り返しテストする場合に便利です。
詳細については、「デバッグ環境のメンテナンス」を参照してください。
ブレイクポイントの設定または統計の作成などのデバッガメンテナンス機能はすべて、ダイレクトコマンドか、またはデバッグメインメニューで提供されるメンテナンス機能を使用して実行できます。 このメニューは、次のいずれかを入力すると開きます。
TEST
(コマンドプロンプト)
MENU
(デバッガ画面のコマンド行)
M
([Debug Break]ウィンドウの[Code]フィールド)
デバッガメンテナンス画面で使用できるダイレクトコマンドのリストを表示するには、PF1 キー(Help)を押すか、コマンド行に疑問符(?)を入力します。
リスト項目を含むデバッガメンテナンス画面には通常、項目をさらに処理するために使用できる行コマンドも表示されます。 行コマンドは、目的の項目の横の[Co]列に入力します。 この列に疑問符(?)を入力すると、有効な行コマンドがリストされます。
プログラム中断中に使用できる主な機能のリストは、次のセクションにあります。 これらの機能は[Debug Break]ウィンドウから、またはデバッガメンテナンス画面のコマンド行から実行できます。
[Debug]ウィンドウのコード | 代替ダイレクトコマンド | 機能 |
---|---|---|
G |
GO |
次のデバッグイベントが発生するまで、プログラム実行を継続します。 |
L |
LIST BREAK |
デバッグイベントが発生したステートメント行に、オブジェクトソースのリストを表示します。 |
N |
NEXT |
ブレイクポイントまたはウォッチポイントに指定されている場合は、次の BREAK コマンドを実行します。 「プログラム中断中の追加コマンドの次のオプション」も参照してください。 |
R |
RUN |
テストモードをオフに切り替え、プログラム実行を継続します。 |
S |
STEP |
実行ステートメントを 1 行ずつ処理します。 |
V |
DIS VAR |
中断されたオブジェクトに定義されている変数のリストを表示します。 |
ブレイクポイントまたはウォッチポイントを表示または変更しているときには、そのそれぞれにデバッガコマンド BREAK
が付加されています。 このコマンドは[Debug Break]ウィンドウを呼び出します。また、このコマンドは削除しないでください。 ただし、プログラム中断中に実行される追加デバッガコマンドを、BREAK
コマンドの後に指定できます。 追加コマンドは、コマンド行にコマンド NEXT
を入力するか、[Debug Break]ウィンドウにファンクションコード「N
」を入力すると、実行されます。
デバッガコマンドは、次の例に示すように、適切なブレイクポイントまたはウォッチポイントのメンテナンス画面の[Commands]フィールドに入力します。
11:38:55 ***** NATURAL TEST UTILITIES ***** 2007-09-06 Test Mode ON - Modify Breakpoint - Object Spy number .............. 1 Initial state ........... A (A = Active, I = Inactive) Breakpoint name ......... DEBUG1P0170_ DBID/FNR ....... 10/32 Object name ............. DEBUG1P_ Library ........ DEBUG Line number ............. 0170 Label ................... ________________________________ Skips before execution .. ____0 Max number executions ... ____0 Commands ... BREAK_______________________________________________________ STACK_______________________________________________________ DIS VAR BONUS_______________________________________________ ____________________________________________________________ ____________________________________________________________ ____________________________________________________________ Command ===> Enter-PF1---PF2---PF3---PF4---PF5---PF6---PF7---PF8---PF9---PF10--PF11--PF12--- Help Exit Last Save Flip Canc |
上の例では、コマンド STACK
の指示によりデバッガが Natural スタックを表示します。 コマンド DIS VAR BONUS
の指示により、デバッガが指定された変数を表示します。 これは、ループにブレイクポイントを設定し、特定の変数の値のみを常に表示させる場合などに便利です。 こうすると、DIS VAR
コマンドを繰り返し入力する必要がなくなります。
詳細については、「ブレイクポイント画面のフィールドと列」および「ウォッチポイント画面のフィールドと列」の各セクションにある[Commands]フィールドの説明を参照してください。
[Display Variable]画面には、変数のすべての定義と、英数字または 16 進形式でのその内容が表示されます。 内容が現在の画面に収まらないラージ変数、または配列定義を持つ変数に使用できる表示機能の詳細については、「[Display Variable]- 詳細」セクションを参照してください。
デバッガが生成した統計レポートを出力したり、PC にダウンロードしたりすることができます。
詳細については、「コール統計のメンテナンス」セクションの「オブジェクトの出力」および「ステートメント実行統計のメンテナンス」セクションの「出力ステートメント」を参照してください。
デバッガは主に、オンラインモードでの対話式動作を目的として設計されています。 原則として、すべてのデバッガ機能はバッチモードで実行できますが、バッチでのオンライン動作の処理(PF キーの使用など)には、複雑なバッチプログラミングが必要な場合があります。 ただし、バッチ処理を行うと便利なデバッガ機能もあります。 その 1 つの例は、「バッチ処理」セクションの「バッチでの統計の生成と出力の例」で説明されているように、アプリケーションに関する統計データの収集と出力です。
このセクションには、セッション 1~5 に必要なサンプルのプログラムとサブプログラムのソースコードを掲載しています。
** PROGRAM 'DEBUG1P: CALLS 'DEBUG1N' FOR SALARY AND BONUS CALCULATION ********************************************************************** DEFINE DATA LOCAL 1 EMPLOYEE (A42) 1 REDEFINE EMPLOYEE 2 NAME (A20) 2 NUMCHILD (N2) 2 ENTRYDATE (D) 2 SALARY (P7.2) 2 BONUS (P7.2) END-DEFINE NAME := 'MEIER' NUMCHILD := 2 ENTRYDATE := D'1989-01-01' * SALARY := 99000 CALLNAT 'DEBUG1N' NAME NUMCHILD ENTRYDATE SALARY BONUS WRITE 'EMPLOYEE RECEIVES:' SALARY WRITE ' PLUS BONUS OF:' BONUS END
** SUBPROGRAM 'DEBUG1N': CALCULATES BONUS AND SALARY INCREASE ************************************************************************ DEFINE DATA PARAMETER 1 EMPLOYEE 2 NAME (A20) 2 NUMCHILD (N2) 2 ENTRYDATE (D) 2 SALARY (P7.2) 2 BONUS (P7.2) LOCAL 1 TARGETDATE (D) INIT <D'2009-01-01'> 1 DIFFERENCE (P3.2) 1 PERCENT (P2.2) INIT <3.5> END-DEFINE DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPANY BONUS := SALARY * PERCENT / 100 END-IF SALARY := SALARY + 1800 /* SALARY PLUS ANNUAL INCREASE END
** PROGRAM 'DEBUG2P': CALLS 'DEBUG2N'FOR SALARY AND BONUS CALCULATION ************************************************************************ DEFINE DATA LOCAL 1 EMPLOYEE (A42) 1 REDEFINE EMPLOYEE 2 NAME (A20) 2 NUMCHILD (N2) 2 ENTRYDATE (D) 2 SALARY (P7.2) 2 BONUS (P7.2) END-DEFINE NAME := 'MEIER' NUMCHILD := 2 ENTRYDATE := D'1989-01-01' SALARY := 99000 CALLNAT 'DEBUG2N' NAME NUMCHILD ENTRYDATE SALARY BONUS WRITE 'EMPLOYEE RECEIVES:' SALARY WRITE ' PLUS BONUS OF:' BONUS END
** SUBPROGRAM DEBUG2N: CALLS 'DEBUG3N' AND 'DEBUG4N'FOR SPECIAL RATES ************************************************************************ DEFINE DATA PARAMETER 1 EMPLOYEE 2 NAME (A20) 2 NUMCHILD (N2) 2 ENTRYDATE (D) 2 SALARY (P7.2) 2 BONUS (P7.2) LOCAL 1 TARGETDATE (D) INIT <D'2009-01-01'> 1 DIFFERENCE (P3.2) 1 PERCENT (P2.2) INIT <3.5> END-DEFINE DIFFERENCE := (TARGETDATE - ENTRYDATE) / 365 IF DIFFERENCE GE 10 /* BONUS FOR YEARS IN COMPANY BONUS := SALARY * PERCENT / 100 END-IF IF NUMCHILD > 0 CALLNAT 'DEBUG3N' NUMCHILD BONUS /* SPECIAL BONUS END-IF CALLNAT 'DEBUG4N' SALARY /* SPECIAL SALARY INCREASE END
** SUBPROGRAM 'DEBUG3N': CALCULATES SPECIAL BONUS ************************************************************************ DEFINE DATA PARAMETER 1 NUMCHILD (N2) 1 BONUS (P7.2) END-DEFINE BONUS := BONUS + NUMCHILD * 50 END
** SUBPROGRAM 'DEBUG4N': CALCULATES SPECIAL SALARY INCREASE ************************************************************************ DEFINE DATA PARAMETER 1 SALARY (P7.2) END-DEFINE DECIDE FOR FIRST CONDITION WHEN SALARY < 50000 SALARY := SALARY + 1800 WHEN SALARY < 70000 SALARY := SALARY + 1200 WHEN SALARY < 90000 SALARY := SALARY + 600 WHEN NONE SALARY := SALARY + 300 END-DECIDE END