Что может вызвать транзакцию CICS для записи из выделенной памяти CICS? - PullRequest
0 голосов
/ 25 января 2012

Я использую CICS в программе Cobol и заметил, что иногда данные записываются из памяти CICS.Это приводит к повреждению данных и остановке моего приложения.Я не знаю, где он добавляется, поэтому я создаю парсер для анализа моего кода Cobol на предмет возможного повреждения в COMMAREA, используемом CICS.Теперь я проверил следующие операторы:

EXEC CICS XCTL
EXEC CICS LINK
EXEC CICS RETURN TRANSID

Для каждого я проверяю, не больше ли длина отправленного сообщения (объявленная в параметре LENGTH), чем отправленная COMMAREA.Затем я проверяю, если DFHCOMMAREA, в принимающей программе не больше, чем отправлено COMMAREA (согласно этому документу http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=%2Fcom.ibm.cics.ts31.doc%2Fdfhp3%2Fdfhp37t.htm):

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

мне интересно, что еще нужно проанализировать, чтобы обнаружить перезапись памяти?

Ответы [ 4 ]

1 голос
/ 06 апреля 2012

Для проверки границ передачи данных всегда используйте transclusion , которое в COBOL называется COPYCODE или COPYBOOK. Передайте корневой элемент данных в коде копирования и скомпилируйте ту же версию в вызывающей и вызываемой программе. Этот COPYCODE является своего рода контрактом для вызываемой программы, поэтому рекомендуется заключить соглашение об именовании, связывающее их вместе. Чтобы убедиться, что они синхронизированы, всякий раз, когда вы меняете COPYCODE, перекомпилируйте все программы, которые ссылаются на него.

Кроме того, использование SSRANGE прекрасно (но кто-то уже упоминал об этом).

1 голос
/ 26 января 2012

NealB имеет хорошую идею .Я предлагаю вам также взглянуть на параметры STGPROT и RENTPGM CICS * .

1 голос
/ 10 февраля 2012

Поскольку вы используете Micro Focus COBOL, вы можете установить переменную memory_strategy (или API CBL_MEM_STRATEGY), чтобы помочь вам анализировать, где происходит ошибка, позволяя среде выполнения защищать память различными способами.Память также может быть проверена с помощью вызова "CBL_MEM_VALIDATE".

Еще одна вещь, которую можно сделать, это использовать поддержку трассировки ... lookup CTF (Consolidated Tracing Facility).Это даст вам представление о том, где вы кодируете во время ошибки.

Некоторые рекомендации, которые помогут вам;

http://kb.microfocus.com/display/4/kb/article.aspx?aid=31645

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60win.sp02ws01%2FHRRTRHRTCF0O.html

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60ux.sp02ws01%2FGUID-762085AC-8396-4D71-9CC1-6231551D3AEE.html

0 голосов
/ 25 января 2012

Когда программа CICS начинает переписывать всю память, она не только «перестает работать», но, возможно, разбить и регион CICS!

Если вы уверены, что LENGTH установлен правильно на LINK s и XCTL s, и что вы Получив COMMAREA в запись такого размера (EIBCALEN), вам следует будь в порядке.

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

Установка границ проверка должна обнаружить ссылки на память вне диапазона, выдать диагностическое сообщение журнал, а затем и прекратить вашу программу до того как рухнет весь регион CICS. Зарегистрированное сообщение должно указать вам исходная строка, в которой произошла ссылка за пределы.

Проверьте SSRANGE опцию времени компиляции. Убедитесь, что он установлен и что ваш регион CICS запускает программы с поддержкой LE с CHECK(ON).

Это должно выйти за пределы памяти ссылки довольно быстро.

...