きどたかのブログ

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

SVCダンプを読むための知識

まだ全然読めてるとは言いがたい部分があるが
前回(SVCDUMPを読むための初歩 - きどたかの日記)から多少は詳しくなった気がする。


コントロールブロックを読むためには、その構造を知った方が良いと自分は考えていて、
コントロールブロックの関係性をちょっと書いてみた。
f:id:kidotaka:20120709012244p:image


Data Areaに関する参考文献はこのへん。
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 V1R12.0 Language Environment Vendor Interfaces
z/OS V1R10.0-V1R12.0 Communications Server SNA Data Areas Vol 1
z/OS V1R10.0-V1R12.0 Communications Server SNA Data Areas Vol 2
z/OS V1R12.0 Security Server RACF Data Areas
z/OS V1R12.0 DFSMShsm Data Areas
他にもJESのとか。


まだ興味のあるところしか書いてないから、
きっと物によってはLEみたいにData Areaと名前がついてないドキュメントにおこされてるのもあるだろう。
CEECAAは重要だと思うところがある。
CEECAAとTCBの関係にはまだ納得がいかない。
TCBのデータを見たときにR12にCEECAAのアドレスがあったはず。
その仕組みがまだ納得いかない。
LEアプリケーションには、プログラミング・コンベンションがあるみたいで、
R12にはCEECAAを入れるんだ、ということらしい。


今回の添えた図は、関連性に着目しているだけのもので、
実際には各コントロールブロックの持つデータにも着目せねばならん。
BIT STRINGで持っている部分は結構判断する情報として有用なものが多い。
特にTCBのFLAG類は意味があって、ハング系の問題で最近よく見てる。


TCBはRBを持っている。RBはRequest Blockだ。
たいていの場合、PRBを見ることになると思う。Program Request Block。
CDEやらLLEやらXTLSTあたりは、モジュールに関する情報と考えていいと思う。
SVRBの持っているWLICには、Interrupt Codeが入ってる。
1バイトのRBWCSA、1バイトのRBINLNTH、2バイトのRBINTCOD。
SVRBはSupervisor RBのはずで、ダンプ取る時には必ず出てくるだろう。
RBINTCODにあるのは、SVC xxのxxの部分でSVC命令の種類が分かる。
そのレベルが分かっても、たぶん自分には大事なことは分からんのだろうけど、
意味の分からないデータを漫然と意味の分からないまま見てるんだと、
不安のみが募るのでこういうのはちびちびと分かるようになっていくしかない。
他に、IRBは、MQのwaitやsignalオプションと関係してるようだ。


ACEEはRACF関係のデータが入ってる。


TIOTはTask Input/Output Table。
JCLに書くDDとかに関係している。
もっと掘り進めばDCBとの関係性が現れてくるだろう。
しかし、USSのファイルを表すエリアは別にあるかも知れないので今後の調査対象にしている。


UMLでクラス名のところに付けてるのは、DSECT名のような、そうじゃないような・・・。
DSECTはData Sectionの略。
書き起こすときにDSECT名をちゃんとチェックしてないから間違って書いてるかも。
IPCS CBF アドレス STRUCTURE(コントロールブロック名)する時に、
コントロールブロック名がDSECT名じゃないことが稀にあると感じている。だからちょっと纏め方に困る。
CBFする時に役に立つものにしときたいという思いがある。
データの先頭にコントロールブロック名を文字として持つものもいれば、持たないものもある。
先頭ではないが先頭付近にeyecatcherと呼ばれるエリアを持つものもある。
eyecatcherはまだ使いこなせてないけど、たぶん用途は「目印」だ。


あとCSECTはControl Sectionで、ロジックのエントリーポイントみたいなもん。
そういう意味では、Javaのメソッド名みたいなもん。


PSA(prefixed save area)は重要なもの。
プロセッサーごとに1つあるはずだ。
http://publib.boulder.ibm.com/infocenter/zos/basics/index.jsp?topic=/com.ibm.zos.zmainframe/zconc_mfhwmultiprocs.htm
ASCBやTCBの新旧を持っている。
と言っても、NEWってなってるのは、互換性のためみたいだからOLDだけ信用しとこうか。
PSAは当然8Kバー以内に保存されている。


RTCTはRecovery/Termination Control Table。
ダンプ取る時なんかに使われてる。
最大16個のアドレス空間の情報を持つためのフィールドを持っている。
IPCS SELECT ALLするか、RTCTをフォーマットすることで、ダンプ取得対象のASID/JOBNAMEが分かる
IP CBF RTCT
なんかRTCTやCVTは特殊みたいで、アドレスが容易に判明するんだろうね、
IPCS symbol definitionsってのが、IPCS Commandsとかに載っている。
ダンプ読む時にIPCSがデータを吸い上げてシンボルを登録するってことじゃないかな。


ASCBはresidencyがbelow 16MでSQAに作られるみたい。
SQAはsystem levelのデータを置くところで、どのアドレス空間からでも見れるはず。
IPCS SELECT ALLで全部のアドレス空間が判明するのはそのためじゃないだろうか。


WEBはWork Element Block。
非常に興味深いもんだ。
IP SYSTRACE TIME(LOCAL)とか使ってSRBなんか出てると
必ずWEBのアドレスが付いてる気がする。
WEBはTCBかSRBへのアドレスを持っており、主従関係がはっきりと分からんが
たぶんSRBがWEBを持つという構造だと予想してる。


SSRBはSuspended SRB。
なんでSuspendedになってるのかを知る方法を会得せねばなるまい。


IHSAはInterrupt Handler Save Area。
エラーが起きた時に、がっつりデータを保存するためのブロックだと思う。
ASXBからしか参照されてないのが興味深い。


ECBにも興味がある。Event Control Block。
どうもコマンドに関係してるっぽい。
Fコマンドって、どういう理屈でパラメータを渡せるようになってるか興味がある。
それを知るには、TVWAとかTCASTとかの、ネットワーク系のコントロールブロックも目を通さないといけない気がする。


svcdump.jarは使った方が良さそう。
スタックトレースくらいはIPCSで簡単に出せるけど、
環境変数とか出すやり方覚えてないので、svcdump.jarに食わせた方が今のところ楽。


もしくはjdmpviewを使いこなせるようになるか。
環境変数とかコマンドライン引数とかはinfo procで出る。
デッドロックを検出するコマンド(deadlock)もある。
昔ダンプからphdファイルを作ったことはある。今となってはそんなことはしないけど。
jextractをしたことの無い人には縁のない代物だろうけど、
IPCS以外でも分析する方法があるんだから、jextractはした方がいいんだよ。
IPCSじゃないと出来ないことが多いけど、
IPCSを使える人が現場にわんさかいるとも思えない。
その点ではjdmpviewを使える人もいないだろうけど。