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

 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

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章