如何在IBM大型机中读取PSW(程序状态字)及PSW中的0C7 Abend代码
嘿,我来帮你理清IBM大型机里PSW相关的操作——这俩问题都是大型机运维/开发里常碰到的点,咱们一步步说:
PSW是大型机里记录程序运行核心状态的关键字段,不同场景下读取方式各有不同:
在线调试场景(比如用IBM Debug Tool)
如果你正在调试程序,直接在Debug Tool里敲命令DISPLAY PSW就能实时查看当前的PSW内容。工具会自动把PSW拆成状态码、指令地址等易读的模块展示给你。通过汇编程序主动读取
要是想在自己的汇编代码里获取PSW,用STAP指令(Store Program Status Word)就可以,给你个简单示例:STAP PSW_STORAGE ; 将当前PSW存储到指定内存区域 PSW_STORAGE DS CL8 ; 定义8字节的存储区(z/OS里PSW固定是8字节)执行这条指令后,
PSW_STORAGE里就存好了完整的PSW,之后你就能根据需求解析各个字段了。从系统转储(Dump)里查看
要是程序Abend生成了转储文件,用IPCS工具分析时,直接输入命令PSW就能调出对应转储的PSW详情,包括状态码、中断码、当前指令地址这些关键信息都一目了然。
首先明确:0C7属于系统Abend码,它的核心对应PSW里的中断码字段,下面分两种情况说明:
通过工具直接查看(最省心)
不管是用IPCS分析转储,还是用Debug Tool调试,当你查看PSW时,工具都会帮你解析好中断码。比如在IPCS里执行PSW命令后,输出里会明确显示类似INTERRUPT CODE = C7的行,加上系统Abend的前缀0,就是你看到的0C7。手动解析PSW字节(适合程序里处理)
z/OS里PSW是固定8字节结构,其中**偏移量为5的字节(从0开始计数)**就是中断码(两位十六进制)。比如0C7 Abend时,这个字节的值就是X'C7',再加上表示程序中断类型的前缀0,就组成了完整的0C7 Abend码。
如果你是用之前STAP指令存下的PSW,直接读取这个位置的字节就能拿到中断码,进而得到Abend码。
内容的提问来源于stack exchange,提问作者Amir

