10バイト
しか定義されていない変数に、気づかずに 12バイト
の値をコピーすると
当然メモリ・リークやメモリ破壊のエラーになるのだが
後続の変数の定義がない場合はエラーにはならない場合がある。
しかし実行していくに従って矛盾が生じてきて最後には予測できない結果を生じてしまう。
元々はメモリ破壊に原因があったのだが、なかなかその場所を特定できないで
デバッグに時間を要してしまう場合がある。
プログラムの開発は簡単であるがデバッグは迷路に入るとなかなか抜け出すことができない。
IBM では、このようなメモリ破壊を検出するツールを OS Ver7.1 から用意している。
それが「デバッグ・メモリー・マネージャー」
である。
「デバッグ・メモリー・マネージャー」
というと何やら難しいツールの使い方を
覚えなければならないように思えるが操作は至って簡単である。
WRKENVVAR + [実行]
によって *JOB (このジョブだけの) 環境変数 : QIBM_MALLOC_TYPE
を
値= DEBUG として登録する。
メモリ・リークなどがあれば
MCH0601、MCH3402、または MCH6801 エラーが発生して厳しく監査されて
エラーの場所を特定できるようになる。
WRKENVVAR
で QIBM_MALLOC_TYPE
を除去する。
デバッグ・メモリー・マネージャーが有効に働くのは C/400だけではなく
RPG のコンパイルやRPGの実行時にもデバッグ・メモリー・マネージャーによる
監査が行われるのでRPGのメモリ・リークも調べることができる。
ただし RPG のコンパイルの時にはデバッグ・メモリー・マネージャーを
使用するとコンパイル・エラーになってしまう場合がある。
OS Ver 6.1 であっても PTF : 5761SS1-SI33945
に
デバッグ・メモリー・マネージャーが含まれている。
弊社ではソフトウェアの品質検査のためにデバッグ・メモリー・マネージャーによる
メモリ・リークがないかどうか検査して将来起こるかも知れないバグを未然に
防ぐようにしている。
デバッグ・メモリー・マネージャーはCLPの内部などにも組み込むことができる。
さらなる詳細は次を参照
http://www.ibm.com/support/knowledgecenter/ja/
ssw_ibm_i_73/rtref/debug_memory_manager.htm