天天看點

大型機彙編(mainframe assembler/HLASM)之DUMP解讀

大型機彙編(mainframe assembler/HLASM)之DUMP解讀

PSW AT TIME OF ERROR 078D0000 00007F86

078D0000 00007F86是出錯時的PSW,一般情況下,我們在乎的有CC(18-19BIT), Program Mark(20-23BIT), Addressing(32BIT), Instruction Address(33-63BIT)

     CC-Condition Code: 一般被用來判斷否跳轉。

     Program Mark:一般用來解讀是否溢出。

     Addressing:用來判斷是24位尋址(此位為0),還是31位尋址(此位為1)。

     Instruction Address:即将要執行的指令的首位址。

以上四個在不同的情況下會有不同的用途,對于尋找錯誤資訊非常有幫助。

ILC 6

ILC - Instruction length code: 出錯指令的機器碼長度,PSW的最後24位減去6就是出錯代碼的記憶體首位址(其實這個才是我們想要的),至于為什麼是最後24位而不是31位,請參考PSW的分析。 

INTC 07

INTC - Interrupt code:  它的具體含義要參考上下文,如果是一般的程式中斷,它代表ERROR;如果是SVC中斷,它代表SVC中斷碼。

ACTIVE LOAD MODULE       ADDRESS=00007F58

本程式裝載到記憶體中的首位址(切記是本程式,不是本load module,一個load module可以包含多個程式)。

OFFSET=0000002E

将要執行的指令在本程式中的偏移量。 00007F58(程式的首位址) + 0000002E(偏移量) = 00007F86(将要執行的指令的實際記憶體位址:PSW的最後24位)。

NAME=FIRSTASM

出錯程式名。因為一個load module會包含多個程式,通過它可以确定錯誤是出現在哪個程式裡。 

DATA AT PSW 00007F80 - FA00C051 C0520000 00000000

00007F80是出錯指令的記憶體位址(這個位址也是可以通過以上的資料簡單算出來的)。

FA00C051 C0520000 00000000是這個位址處實際存儲的資料,我們知道彙編指令的機器碼長度一般為2/4/6,而究竟取多少位,主要參考第一個位元組(FA),通過它可以最終确定出錯機器碼的長度,不過還有一種更簡單的方法-直接看ILC。ILC是幾就去幾位,本例中為6就取6位:FA00C051 C052。此時我們可以反彙編然後鎖定出錯指令,當然也可以直接在assemble listing資料集裡直接搜,也可以快速鎖定出錯指令。 

GR 0:FD000008   1: 00006FF8

程式出錯時,通用寄存器的即時值,其中的某些資料還是比較重要的,比如R13的值,通過它可以找到主子程式之間的調用鍊條。

另外,通過它還可以看得出程式是運作在S390 模式下而非Z/OS。

注:本文最上面的截圖隻是dump時較為常見的一種情況,比如NAME=UNKNOWN,這種情況就說明此時的PSW已經不再指向本load module覆寫的位址了。這樣原因還要具體情況具體分析。

有疑問請聯系QQ349106216