あーーーーーー疲れたっ!
先週から障害が発生していてそれの対応に追われていました。
うちが作ったAPIをSolaris9対応してリリースするってだけの作業だったのに、いざリリースしてみたらちょっと動かすとコアダンプ…。

環境やら業務プログラム部分との切り分けをしてうちの会社でも再現出来たのが昨日の朝。
SEGV(アクセスアドレス異常)ってのはたいてい落ちた場所が原因じゃないので、真の犯人を探すのが大変…。(つд`)
(※どこかでメモリ空間の中身ぶっ壊してて、壊れたアドレスに触った所で落ちるから、落ちたとこが壊したとこじゃないのです)

で!どうにかさっき真犯人を捕まえられましたーーー!ヽ(´▽`)ノ

いやもう正直お手上げかと思いましたよ…。

※以下判る人のみお読みください
結局の所問題となったのはスレッドセーフエリアの処理部分。
UNIXで動かしていて、thr_keycreate()でキーを生成して、スレッドの初期処理でmallocしたエリアをthr_setspecific()でキーに紐付けています。
で、必要な時にthr_getspecific()で取り出すわけです。
今回問題になったのは終了処理。
thr_getspecific()でアドレスを取得して、free()してるのはいいんだけど、それ以外には何もしていない。
thr_setspecific()でキーにアドレスを紐付けているので、おそらく裏で制御構造体みたいなものを持っていて、そこにアドレスを持っているはず。
このままだとfree()したアドレスがそこに入ったままになっているので、再度同じスレッド内で初期化処理が実行されると、free()だけされたアドレスを参照してしまうはず…。
という所で問題となっていました。
マニュアルの記述が無いので正解は判りませんが、終了処理ではfree()するだけでなく、thr_setspecific()の第2引数にNULLを指定して、制御構造体内のアドレス情報もクリアしてあげる必要があるみたいです。

言われてみれば当たり前っぽいんですけどね…。(つд`)

コメント

お気に入り日記の更新

最新のコメント

日記内を検索