2014年05月08日

WindowsのRuby 2.0とgtk2 gemの組み合わせで作ったプログラムの終了時にsegmentation faultが出てしまう場合の対処法

 メインウィンドウのクローズボタンを押すかAlt+F4押し下げでdelete_eventシグナルを受け付け、その時のプログラムの状態によってdelete_eventシグナルのハンドラで真偽値のどちらかを返し、(その戻り値によって発生するかどうかが決まる)destroyシグナルのハンドラでGtk.main_quitを呼び出す形でプログラムの終了/非終了を制御している自作プログラムで、delete_eventシグナルのハンドラでfalseを返したときになぜかプログラムが正常に終了せずに、segmentation faultが出てしまいプロセスが終了しないことがあった。

 そのときのエラーメッセージ。

C:/Users/foo/hoge.rb: [BUG] Segmentation fault
ruby 2.0.0p451 (2014-02-24) [i386-mingw32]

-- Control frame information -----------------------------------------------
c:0001 p:0000 s:0002 E:000314 TOP [FINISH]


-- C level backtrace information -------------------------------------------


 これだけなので、自分の知識では原因がまったく推測もできず困ってしまったのですが、とりあえず以下のやり方でエラーを出さずに終了させるようにできました。

delete_eventシグナルのハンドラ内でプログラムを終了させる判定になったら、falseを返すのではなく明示的にdestroyシグナルのハンドラ(もしくは直接Gtk.main_quit)を呼び出してしまう


 例えば、エラーが出るコードが以下のようになっているとしたら、

def on_window_main_delete_event(widget, *args)
 !quit?()
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end


 以下のように書き換えます。

def on_window_main_delete_event(widget, *args)
 if quit?()
  on_window_main_destroy(widget)
 end
 true
end

def on_window_main_destroy(widget, *args)
 Gtk.main_quit
end
posted by chrono at 07:53| Comment(0) | Ruby
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: