きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

SVCDUMPを読むための初歩

絶賛IPCS勉強中。相変わらず独学が多い。
今日、少し参照したマニュアル。(たぶん誰も読まないと思う)
z/OS V1R12.0 MVS Data Areas, Vol 1 (ABEP-DCCB)
z/OS V1R12.0 MVS Data Areas, Vol 2 (DCCD-IEFDOKEY)
z/OS V1R12.0 MVS Data Areas, Vol 3 (IEFDORC-ISGYQCBP)
z/OS V1R12.0 MVS Data Areas, Vol 4 (ISGYQUAA-MCHEAD)
z/OS V1R12.0 MVS Data Areas, Vol 5 (MCSCSA-SNAPX)
z/OS V1R12.0 MVS Data Areas, Vol 6 (SPD-XTLST)


正直、これで何かがすごく分かるようになるわけではないが、
さまざまなデータエリアの名称を知ることくらいは出来る。
z/OSコレクションキットにも、Information Centerにもこれは収録されてないので、
Internet Libraryから落としてこないといけない。


例えばASCBはADDRESS SPACE CONTROL BLOCKの略で、これの持つ構造が分かる。
IPCSコマンドで出てきた情報の名前くらいが分かるのであって、
どのビットに何が立ってたらというのは上記のマニュアルから知ることはほとんど出来ない。
そのような情報はほとんど見つけられないが、簡単なもの他のマニュアルに載っている。


上記のマニュアルよりもまずはこっちを読破せねばならない。んー、ムリ。
z/OS V1R12.0 MVS Interactive Problem Control System (IPCS) Commands
z/OS V1R10.0 - V1R12 MVS Interactive Problem Control System (IPCS) Customization
z/OS V1R12.0 MVS Interactive Problem Control System (IPCS) User's Guide
z/OS V1R12.0 MVS Diagnosis Reference
z/OS V1R12.0 MVS Diagnosis Tools and Service Aids
z/OS V1R12.0 Language Environment Debugging Guide


例えば、こんなIPCSコマンドを打ってみよう。
IPCS STATUS
これはパネルからでもいける。
とりあえずこのコマンドは必ず使うだろう。


まだよく理解出来てないコマンド。
これはダンプが不完全じゃないかを調べる目的で使うようだ。
IPCS LIST 0E0. BLOCK(0) LENGTH(X'10') AREA
0E0.のところの記憶が定かではない。違う文字かも。
0E0.からLENGTHまでがデータ記述子のようなんだが、なんで0E0.なんだっけ・・・。
先頭のPhysical Blockの長さ16バイトを取って来て、0E0.とマッチするってことかな?
0E0はきっと、Completion Codeがエラーなやつがいないかを調べるのではないだろうか。
あと、たぶんCurrentのASIDが暗黙的に補完されてる気がする。


IPCS VERBEXIT LEDATA 'ASID(94) TCB(009DFE88) CEEDUMP'
これは該当のTCBのトレースバックが見れる。Java風に言うとスタックトレース
IPCS VERBEIXT LEDATA 'ASID(94) TCB(009DFE88) ALL'
これだと、PSWレジスターも見れるはず。
WASzのInformation Centerだけじゃなく、JDKで紹介してるIPCSコマンドも見よう。
http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp


IPCS CBFORMAT RTCT
RTCTはRecovery Termination Control Tableの略。
Formatをしたいのはこのデータエリアということだろう。
これで出てくるASIDが、ダンプに含まれているはず。1つ以上のASIDが存在する。
または
IPCS SELECT CURRENTでも良いかも?


IPCS SELECT ALLをすると、ダンプ取得時に動いてた全てのASIDやJOBNAMEが分かる。
どのASIDがどのJOBNAMEかをこれを使ってメモしとく感じ。


たぶんJavaをやってるとまずこのコマンドを使いそう。
IPCS VERBEXIT LEDATA 'NTHREADS(*)'
すべてのスレッドのトレースバックが見れる。
ちなみにProcessがEnclaveを持ち、EnclaveがThreadを持っている。
z/OS V1R12.0 Language Environment Concepts Guide


IPCS SUMMARY FORMAT ASID(X'94')
これはTCBサマリー等が見れる。
該当のASIDの全TCBが見れて、CMPの列が0以外のものはエラーになってる。


あと、IPCS LISTコマンドでデータ記述子以外にAREAみたいなAttribute Parameterがある。
z/OS V1R12.0 MVS Interactive Problem Control System (IPCS) Commands
これのChapter 3の話。
AREAではなく、INSTRUCTIONを選ぶことが出来るので、
とあるアドレスから何バイトかを取って来て、実際のInstructionを見ることが出来たはず。
PSWからInstructionアドレスを得てから使う感じだろうな、きっと。


Instructionと言えば、これもInstructionが見れたはず。
IPCS SYSTRACE ALL TIME(LOCAL)
WASzはきっとPCがたくさん出てると思う。
PCってアセンブラだっっけかな・・・。
まあ、アセンブラのことも勉強しないとね。
z/Architecture Principles of Operation
z/Architecture Reference Summary
z/OS V1R12.0 MVS Programming Authorized Assembler Services Guide
z/OS V1R12.0 MVS Programming Authorized Assembler Services Reference Vol 1 (ALE-DYN)
z/OS V1R12.0 MVS Programming Authorized Assembler Services Reference Vol 2 (EDT-IXG)
z/OS V1R12.0 MVS Programming Authorized Assembler Services Reference Vol 3 (LLA-SDU)
z/OS V1R12.0 MVS Programming Authorized Assembler Services Reference Vol 4 (SET_WTO)


PSWでInstructionのアドレスが分かったら、z/Architecture Reference Summaryから、
どのInstructionが使われてるのかを調べる感じ。
Program Callなら'B218'がOPCODE。2バイトのOPCODEだね。3バイトのもあったかも。


WASzのIPCS VERBEXIT BBORDATAはまだ使ってない。
DB2にもVERBEXITで出せる情報があるんだけど、使い方はマニュアルを注文しないと分からない。
WMBはそもそもIPCSに関する情報が全然載ってない。
WMBがABENDしたら、オレはお手上げ。
いちおうLEアプリケーションだから、何かしら解析出来るだろうけど、
ミドルウェア専用のVERBEXITが用意されてないので、ダンプから分析するのは無理じゃないかな。
サービストレースを取ってくださいとか言われて終わると思う。超不安。