2015-05-08 8 views
0

Есть ли способ идентифицировать имя программы в стеке вызовов? т. Е. У меня есть PGM X, который ссылается на PGM B, и эта ссылка связана с PGM C, а затем, на C, я хочу знать, какая программа инициирует вызов (PGM X)?CICS Program Stack in COBOL

+1

Почему вы хотите это сделать? Я также предполагаю, что ответ не всегда PGM A, потому что иногда PGM Z вызывает/ссылки на PGM B. Что это такое, CALL или LINK? Что вы хотите знать, идентификатор программы CALLER из PGM B, имя загрузчика, что? –

+1

1- Это мой коллега, у которого есть эта «проблема», потому что он хочет зарегистрировать начальный идентификатор вызывающего абонента. 2- Вы принимаете правильно! Если бы все участники PGM A были вызывающими, у нас не было «проблемы» 3- Это LINK. 4- В случае, если это то же самое. – JCNat

+0

Вам нужно будет уточнить свой (их) вопрос. Если ответ всегда PGM A, то проблем нет. По-видимому, это не так, но вопрос не говорит. Используется ли CALL или LINK? Или другое? Или XCTL? Если CALL, это статический или динамический CALL? Хотя есть способы сделать это ретроспективно, лучше всего передать нужную информацию журнала из начальной программы. –

ответ

0

Нет поддерживаемого способа сделать это. Некоторые люди пытаются преследовать области сохранения и прогуливаются через исполняемый код, чтобы определить его имя, но я подозреваю, что все заканчивается слезами.

Одна из проблем заключается в том, что у вас нет гарантии того, что LINK или XCTL были реализованы. В случае динамических вызовов вы можете отслеживать цепочку областей сохранения, но затем вам нужно выяснить, как идентифицировать модуль. Не то, что вы, вероятно, сможете сделать только в COBOL.

+0

Спасибо @cschneid. Я думал об этом, но стоило спросить, мы никогда не знаем! – JCNat

1

Вы можете сделать это, но это займет немного ассемблера. По сути, вам нужно преследовать области сохранения и выполнить CSVQUERY на обратном адресе, это даст вам имя модуля, которому принадлежит эта область сохранения.

Есть несколько особенностей, вам необходимо следить за модулями времени выполнения Cobol (с префиксом IGZ) и/или модулями языковой среды (с префиксом CEE). Когда вы выполняете вызов Cobol Call, он вызывает модуль времени выполнения, который затем вызывает вызванную вами программу.

Кроме того, это не будет определять программы, которые использовали E. C. LINK или E. C. XCTL, только вызовы Cobol Call, которые используют соглашения об экономии OS.

Пример:

CSVQUERY SEARCH=JPALPA,INADDR=<R14_from_savearea>,OUTEPNM=<module_name_output>,MF=(E,PLIST) 

ли, что несколько раз для каждого обратного адреса на области сохранения цепи, и вы будете знать все звонки.