海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
Ruby を SEGV させまくるようになったら、そろそろ脱初心者でしょうか。 あ、どうでもいいですね。
GC.disable にすると逃げられたりするので、GC safe じゃないんだなぁとか思って いろいろ見直したり (「RubyExtensionProgrammingGuide」(青木峰郎さん)とか参照)。
しかぁし!僕の場合は、もっとヘボいバグでした。 (volatile 問題もいっこだけあった。)
前者は、gc_mark_children がたまたま int 値がポインタにみえたのを参照しにいって SEGV。
後者は、後者は……。 初心者臭すぎて恥ずかしいのを承知で書いておくと、問題の自作拡張ライブラリ関数を呼ぶまえに puts (こちらは Rubyの) をいれると OK, とると SEGV というように見えていました。 わかってから現象をふりかえると、たしかにどうみても未初期化ポインタです *1。 ありがとうございました。
普段 gdb つかえない子なんですが、ちょっとだけ使っちゃいました。
% ruby hogehoge.rb ; ... SEGV から core を吐く... % gdb -c core /usr/local/bin/ruby (gdb) bt
ってな感じで、シグナル受ける直前どこにいたのかがわかります。 (「RubyがSEGVしたら」(おなじく、青木峰郎さん)参照)
あとは、printf デバッグ。え? gdb つかえないんだって。
Binary Hacks よんでべんきょーしなくちゃ*2。 (そのまえに gdb のマニュアル読まないとね)
「volatile 問題」といえば、日本人同士で話すときに "volatile" をなんと発音するべきかという問題もあります。「う゛ぁるたいる?」<br><br>http://www.google.co.jp/search?hl=ja&q=volatile+%E7%99%BA%E9%9F%B3&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja<br><br>あぁ、「う゛ぉらたいる」ね。やっぱり {'o' => 'お', 'a' => 'あ'} という連想には抗えないか。