ToDo:
最近、X稼働中に固まることが多いので、KDBに落ちてるのを疑って ddb_enable=YESを設定してみたが効果なし。 ダメモトでkdb.enter.defaultをkdb.enter.panicと 同じように仕込んだところリブートしてた…
残念ながら dumpは録れていない
状況からして、
ようです。
ddb hookを二分法で絞り込むべきところか?
strage回りを疑って、kdb.enter.camとkdb.enter.vfslockに だけ仕込みをしてみる
従って、以下の方針で修正する
CaOpen系とCaClose系のコードは、EPICS\CaOpenとEPICS\CaClearChannelに統合できそうなので、動作仕様の違いをまとめておく
関数 | 引数の数 | callback | ca_pend_io | retry | chidリーク |
CaOpen1 | 1 | なし | あり | なし | ca_pend_ioタイムアウト時 |
CaOpen2 | 1 or more | なし | あり | あり | ca_pend_ioタイムアウト・リトライ時 |
EPICS\$CaOpen | 1 | あり | なし | なし | なし |
関数 | 引数の数 | ca_pend_io |
CaClose1 | 1 | あり |
EPICS\$CaClearChannel | 1 | なし |
調査結果のまとめ
実装は、nfCaOpen @ src/tfefun2.f (casearch_/capendio_)
実装は、tfefun2 @ src/tfefun2.f (casearch_/capendio_)
引数 | 基本タイムアウト |
1 | 0.5 |
2 | 0.5 |
3 | 0.6 |
4 | 0.8 |
8 | 1.6 |
12 | 2.4 |
16 | 3.2 |
20 | 4.0 |
24 | 4.0 |
レコード名に長い文字列を与えて、ca_create_channelがECA_BADSTRを返す状況にすると、SEVCHKマクロでSEGVする
当該エラーは、nciu::nciu(コンストラクタ)内のnameLengthTempチェックからthrowされるcacChannel::badString例外に起因している
レコード名の長さがMAX_UDP_SEND - sizeof(caHdr)を超過している際に発生し、libca内の構造体の整合性が破壊されている模様(試験環境でのしきい値は、1008bytes)
ca_create_channelに投げる前に長さをチェックすべき
2017/12/08追記
従って、1024 - 16 → 1008文字のレコード名(NULL文字を除く)で cacChannel::badString例外が発生する
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記