コールスタックでプログラム名を特定する方法はありますか? つまり、PGM B にリンクする PGM X があり、これは PGM C にリンクします。次に、C で、どのプログラムが呼び出し (PGM X) を発信したかを知りたいですか?
3 に答える
これはできますが、少しアセンブラが必要です。基本的に、保存領域を追跡し、戻りアドレスで CSVQUERY を実行する必要があります。これにより、その保存領域を所有するモジュールの名前が得られます。
Cobol ランタイム モジュール (接頭辞 IGZ) や Language Environment モジュール (接頭辞 CEE) に注意する必要があります。Cobol Call を実行すると、呼び出したプログラムを呼び出すランタイム モジュールが呼び出されます。
また、これは EC LINK または EC XCTL を実行したプログラムを識別するのではなく、OS 保存域規則を使用する Cobol Call 呼び出しのみを識別します。
例:
CSVQUERY SEARCH=JPALPA,INADDR=<R14_from_savearea>,OUTEPNM=<module_name_output>,MF=(E,PLIST)
保管域チェーンの戻りアドレスごとにこれを繰り返し行うと、すべての呼び出し元がわかります。
これを行う方法はサポートされていません。保存領域を追跡し、実行可能コードを調べてその名前を特定しようとする人もいますが、すべてが涙で終わるのではないかと思います。
問題の 1 つは、LINK または XCTL がどのように実装されているかを保証できないことです。動的呼び出しの場合、保管域チェーンをたどることができるかもしれませんが、モジュールを識別する方法を理解する必要があります。COBOLだけでできることではありません。