IBM i (旧AS400）の自己学習メモ　RPG Ⅳプログラミング編０６　デバッグチートシート

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

ここではRPG Ⅳプログラミングを進めていく上で使うことになってくる`STRDBG`でのラインデバッグ機能について、使い方やコマンドなどをまとめています。
随時更新していこうと思いますが、まずは現段階で自分が使った（理解した）ものだけまとめていこうと思います。

# デバッグチートシート

## RPGプログラムのラインデバッグ開始方法

### ラインデバッグを行うための準備

ラインデバッグを行うためには、RPGソースをコンパイルする際のオプション`DBGVIEW`に`*SOURCE`を指定してコンパイルしておく必要があります。
（実際には*LISTを指定して行うこともあるみたいですが、よくわかってないのでここでは割愛）

1. コンパイル対象のソースコードのOPTに`14`と入力し`F4`キーを押下
2. `F10`キーを押下して追加パラメータを表示
3. Page Downで`Debugging views  . . . . . . . . DBGVIEW`のパラメータ指定の画面を表示し、`*SOURCE`と入力
4. Enterキーを何度か押してRPGプログラムをコンパイル

![AS400-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1c2910af-6b19-144d-1ce0-42ebc8973799.gif)

### STRDBGコマンドを実行してブレークポイントを設定

以下のコマンドを実行してデバッグを開始する。

- PGM
    - ライブラリ/RPGソースを指定
- UPDPROD
    - デフォルトは*NO
    - このパラメータは、ジョブがデバッグ・モードになっている時に、プロダクション・ライブラリー中のデータベース・ファイルをレコードの更新または新しいレコードの追加のためにオープンできるかどうか指定する。<br>https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_74/cl/strdbg.htm#STRDBG.UPDPROD
    - *YESを指定すると、ファイルを更新・追加のためにオープン可能となります。

```shell:STRDBG
STRDBG PGM(YAMAGUCHI1/RPG91) UPDPROD(*YES) 
```

上記コマンドを実行した後、`Display Module Source`の画面が表示されます。
ここでブレークポイントを設定します。
ブレークポイントは、以下２つの方法で指定出来ます。

- 対象の行にカーソルを合わせて`F6`キーを押下
- `Debug . . . `の入力エリアに`break {行番号}`を入力してEnter

ブレークポイントを設定したら`F3`キーで`Display Module Source`画面を閉じます。

![AS400-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/07b6c05d-3ff0-e160-de29-515f9c2bcf8f.gif)

### 対象のRPGプログラムを実行

```shell
call rpg91
```

プログラムを実行すると、ブレークポイントを設定した行番号のところで処理が止まって、`Display Module Source`画面が表示された状態となります。
この画面の状態になれば、ようやくデバッグスタートです。

<img width="1088" alt="スクリーンショット 2020-05-06 19.08.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/f3afe1d1-8340-2329-8e63-145af719cece.png">

### デバッグモードを終了

STRDBGコマンドを実行すると、ジョブがデバッグモードになるようです。
この状態で、もう一回STRDBGコマンドを実行するとエラーとなります。

一度デバッグモードにしたら、`ENDDBG`コマンドを実行してデバッグモードを終了する必要があります。

## １ステップ次の行に処理を移す

`F10`キーを押下すると処理が１ステップ次に進む。

![AS400-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9b7f800c-e1a1-b1b0-b14e-f2548caf53c1.gif)

## 次のブレークポイントまで一気に処理を進める

`F12`キーを押下すると、処理が次のブレークポイントまで一気に進みます。
F10キーは１ステップですが、まとめて一気に実行したい場合に使います。

## 変数の中身を確認

- 対象の変数にカーソルを合わせて`F11`キーを押下
- `eval {変数名}`

<img width="1088" alt="スクリーンショット 2020-05-06 19.14.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8cb7f391-161c-883e-abcf-e5453e89b93e.png">
構造体の変数の場合、その構造体の中身も全部確認できるようです。
<img width="1088" alt="スクリーンショット 2020-05-06 19.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/eaa11c99-6ee6-6bcb-f478-8991819c0784.png">

## 変数の値を変更

- `eval {変数名} = {値}`

## 変数の属性（データ型，サイズ）の確認

- `attr {変数名}`


```shell
attr i
```
<img width="1088" alt="スクリーンショット 2020-05-07 6.36.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/80012745-3573-d86d-f534-91e266b086e3.png">


## 特定の条件に一致したときにブレークポイントが動作して処理が止まるようにする

例えば、 iが1から10までのFOR文があったとして、 i=5のときにブレークポイントが動作して処理が止まるようにしたい。といった場合など。

`break {行番号} when i = 5`

条件指定でブレークポイントを設定した後は、F12キーを押下して処理を一気に進める。

## OPTION(*NODEBUGIO)

入出力仕様書に停止点を生成するか指定するオプションで、`*NODEBUGIO`とすることで入出力仕様書に停止点を生成しない。
RPG Ⅳから使えるようになった指定のようで、デフォルトは`*DEBUGIO`。

指定方法としては

- RPGのH仕様書に`H OPTION（*NODEBUGIO)`と定義する
- `CRTBNDRPG`コマンドのオプションで`*NODEBUGIO`を指定する