【问题标题】:Abend Causing Line异常引起线
【发布时间】:2013-06-14 06:09:52
【问题描述】:

有什么方法可以从带有错误消息的假脱机中给出的偏移量(如offset +00007D0A at address 1515CD0A)中找到导致异常结束(如SO4C)的确切行号。?

【问题讨论】:

    标签: db2 cobol mainframe cics rexx


    【解决方案1】:

    如果您的程序是使用选项 OFFSET,NOLIST 编译的,您将在输出列表中获得一个动词/行号列表,其中包含从程序开始的“偏移量”。列表中具有最接近偏移量但小于或等于异常结束中报告的“偏移量”的行号是您要查看的位置。

    如果您使用 NOOFFSET,LIST,您将在编译列表中获得“生成的汇编程序”,并且您的异常结束“偏移量”应该与生成的指令之一的“偏移量”完全匹配,并且您应该能够从中很容易识别 COBOL 源代码行,它是列出实际机器指令之前的第一个带有行号的动词。

    请记住,在极少数情况下,您设法覆盖程序代码并最终导致异常终止,您必须更加努力,但对于“普通”异常终止,这非常简单。

    如果您使用编译器选项 NOLIST,NOOFFSET,那么您将一无所知。使用其中一个选项集重新运行编译。除非程序大小相同,否则再次运行异常结束作业

    如果您使用 LIST,OFFSET,编译器将生成一条诊断消息,您必须选择其中一个有效选项。 LIST 和 OFFSET 是互斥的。

    【讨论】:

    • 需要注意的一点是,一些异常结束,如 S04C,是由(在这种情况下)由 DSNHLI 调用的 DB2 例程生成的,因此偏移量可能没有意义,例如,be way超出程序对象的大小。但是,CEEDUMP 会向您显示堆栈中最后一次调用的点(同样,对于 S04C、DSNHLI 或类似的),您可以使用它来确定生成错误的调用在哪里。
    • @zarchasmpgmr,我不明白你的观点与这个问题有什么关系。尽管提供的标签令人困惑(DB2、CICS、REXX),但没有任何迹象表明它只是 COBOL 程序中的普通异常终止,当时只是在执行一些 COBOL 操作。对于 COBOL 程序之外的任何地址/偏移量,显然有一个不同的过程涉及计算程序控制如何“到达那里”。也许我错过了,但我没有在问题中看到任何需要提及数百个远程可能性的内容。
    • Bill,他提到 S04C 指向 DB2 的事实,并且根据定义将在来自 COBOL 源的编译器生成的代码之外。您的经典 S0Cx 异常终止可能在编译代码中,偏移量计算将在程序中。
    • 答案在我发布后的几分钟内就被接受了,所以我认为异常结束不是在另一个模块中的情况,该模块尚未被识别,并且位于“之后” COBOL 程序,因此被异常终止报告者错误地认为是 COBOL 程序的一部分,它没有说 S04C,而是说 SO4C。标记 db2,还有 cics,rexx。如果没有接受,它更有可能是 S04C。有了Accept,我认为是S0C4。让我们问问巴兹尔...实际上,他在提出问题后一个小时就没有在线,所以我想我们永远不会知道...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2021-07-27
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多