トップ «前の日記(2007-01-30 (Tue)) 最新 次の日記(2007-02-02 (Fri))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2007-01-31 (Wed)

[Ruby] Ruby を SEGV させまくり

Ruby を SEGV させまくるようになったら、そろそろ脱初心者でしょうか。 あ、どうでもいいですね。

GC.disable にすると逃げられたりするので、GC safe じゃないんだなぁとか思って いろいろ見直したり (「RubyExtensionProgrammingGuide」(青木峰郎さん)とか参照)。

しかぁし!僕の場合は、もっとヘボいバグでした。 (volatile 問題もいっこだけあった。)

  • INT2FIX し忘れて C の int をそのまま Ruby の Array に push していた箇所があった
  • auto 変数(←死語?)を初期化せずに使ってしまっていた箇所があった。

前者は、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 のマニュアル読まないとね)

*1 ちなみに null pointer チェックはしていた。だから、たまたまスタックフレームが 0 クリアされていたら正常動作して、ゴミが乗っていたらだめだった。

*2 まだ買おてません。会社もよりの書店に並んだら買おうと。Amazon ったら負けだと思っている(うそ

本日のツッコミ(全1件) [ツッコミを入れる]
# うんの (2007-01-31 (Wed) 11:37)

「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' => 'あ'} という連想には抗えないか。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声