Исчезнуть причинную линию

Есть ли способ найти точный номер строки, которая вызывает абенд (например, SO4C), по смещению (например, offset +00007D0A at address 1515CD0A), указанному в спуле с сообщением об ошибке?


person Basil    schedule 14.06.2013    source источник


Ответы (1)


Если ваша программа скомпилирована с параметрами OFFSET,NOLIST, вы получите список команд/номеров строк в выходном листинге, который содержит "смещение" от начала программы. Номер строки в списке, который имеет ближайшее смещение, но меньшее или равное «смещению», указанному в абенде, — это то место, где вы хотите искать.

Если вы используете NOOFFSET,LIST, вы получите «сгенерированный ассемблер» в своем листинге компиляции, и ваше «смещение» abend должно точно совпадать со «смещением» одной из сгенерированных инструкций, и вы сможете легко идентифицировать Исходная строка COBOL из этого, это первый глагол с номером строки перед перечисленной фактической машинной инструкцией.

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

Если вы используете параметры компилятора NOLIST,NOOFFSET, вы ничего не поймете. Повторно запустите компиляцию с одним из установленных параметров. Если размеры программ не одинаковы, снова запустите задание отмены.

Если вы используете LIST,OFFSET, компилятор выдаст диагностическое сообщение, и вам придется выбрать один из допустимых вариантов. LIST и OFFSET являются взаимоисключающими.

person Bill Woodger    schedule 14.06.2013
comment
Следует помнить, что некоторые абенды, такие как S04C, генерируются (в данном случае) подпрограммами DB2, вызываемыми DSNHLI, поэтому смещение может не иметь смысла, например, намного превышать размер вашего программного объекта. Однако CEEDUMP покажет вам точку последнего вызова в стеке (опять же, для S04C, DSNHLI или аналогичного), и вы можете использовать это, чтобы определить, где находится вызов, вызвавший ошибку. - person zarchasmpgmr; 17.06.2013
comment
@zarchasmpgmr, я не понимаю, как ваша точка зрения связана с вопросом. Хотя предоставленные теги сбивают с толку (DB2, CICS, REXX), нет ничего, что указывало бы на то, что это просто abend в программе COBOL, просто выполняющей некоторые действия COBOL в то время. Для любого адреса/смещения, которые находятся за пределами программы COBOL, очевидно, существует другой процесс, связанный с выяснением того, как туда попало управление программой. Возможно, я пропустил это, но я не увидел в вопросе ничего такого, что требовало бы упоминания о сотнях отдаленных возможностей. - person Bill Woodger; 18.06.2013
comment
Билл, тот факт, что он упомянул S04C, указывает на DB2 и по определению должен находиться за пределами сгенерированного компилятором кода из исходного кода COBOL. Ваши классические абенды S0Cx, вероятно, будут в скомпилированном коде, а вычисление смещения будет в программе. - person zarchasmpgmr; 20.06.2013
comment
Ответ был принят в течение нескольких минут после того, как я его опубликовал, поэтому я предположил, что это не тот случай, когда абенд находится в другом модуле, который не был идентифицирован и который расположен после программы COBOL и, следовательно, считается автором. abend-reporter ошибочно считается частью программы COBOL. Он не говорит S04C, он говорит SO4C. Теги: db2, а также cics, rexx. Без Accept это, скорее всего, будет S04C. С Accept, я думаю, S0C4. Давайте спросим Бэзила... на самом деле, он не был в сети уже через час после того, как задал вопрос, так что я думаю, мы никогда не узнаем... - person Bill Woodger; 20.06.2013