きどたかのブログ

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

実行GのABENDに関する考察

CEEDUMPを吐いて、WMBの実行GがABENDという状況。
JOBLOGを見るとJavaのスレッドでStackOverFlowError。
StackOverFlowErrorはたいがいアプリの問題。

しかし、結果的にABENDするのは何故だろうか。
CEEDUMPのTracebackからはesqlからjavaを読んでいるように見受けられる。


そもそもWMBはC++あたりの言語で書かれていて、
C++からJavaを読んでるという仕組みになっている。
つまりはJNIでJVMを作成して、あれやこれやしている。
自分はC++JVMを動かすコードは書いたことはないけど、
JNIとして規定されているので、さほど難しいことには思えないけど。


CEEDUMPを見ると、getStringCharsというJNI関数が呼ばれ、
その先でz/OS固有っぽい関数が呼ばれている。
この2つの関数はJ9にライブラリに存在する。
例外はこのz/OS固有っぽい関数で発生している。


以下の例外がCEEDUMPに出ている。z/OS固有っぽいところで起きてるやつ。
CEE3204S
The system detected a protection exception (System Completion Code=0C4).


このメッセージは「Language Environment Run-Time Messages」に載っている。


気になるのは、例外発生中に、なんでgetStringCharsなんて呼んでるんだろうという点。
JNI仕様の「Exception Handling」の項目に書いてある部分。
ペンディング中の例外がある場合に安全に呼べるJNIはこれら。
ExceptionOccurred()
ExceptionDescribe()
ExceptionClear()
ExceptionCheck()
ReleaseStringChars()
ReleaseStringUTFChars()
ReleaseStringCritical()
ReleaseArrayElements()
ReleasePrimitiveArrayCritical()
DeleteLocalRef()
DeleteGlobalRef()
DeleteWeakGlobalRef()
MonitorExit()
PushLocalFrame()
PopLocalFrame()
つまり、getStringCharsなんて呼んでていいのかってこと。
それともExceptionClearをちゃんと先に呼んでいるのだろうか?


で、この疑惑を受けて、esqlからjavaを呼び出した先で、
例外が起こった場合はどうなるかってのを調べるためだけの
簡素なアプリでも作ろうかなって思うわけだ。

あと、他に解析に有効な手段があまり無くて困ってる状況だが、
例えば-verbose:jniを仕込むのもアリかもしれん。