修行が足りない

自身でコンパイルしたRuby 1.8.7-p160でirbを起動するとRubyインタプリタが落ちてしまう件だが、

E:\ruby1.8.7_p160\bin\ruby.exe -e "STDOUT.sync=true;STDERR.sync=true;exec($0=ARGV.shift, *ARGV)" E:/ruby1.8.7_p160/bin/irb.bat --prompt simple
require 'rubygems'
=> true

RubyMineのirbでは落ちない。うーん。

とそこに偶然にも助け船が。

ActiveScriptRuby 1.8.7-p160 - L'eclat des jours
artonさんによってつい先日公開されたばかりのActiveScriptRubyだが、バンドルされているRubyが同様にp160なので試してみようとインストールしてみた。当然のごとくirbが落ちるようなことは無い。

となると私がコンパイルしたバイナリに原因があるに違いないわけで、一つずつDLLやSOを切り替えて試してみたのだが、なんのことはない、Rubyのランタイムであるmsvcrt-ruby18.dllを切り替えた瞬間に落ちなくなった。

やはり私の作ったバイナリに何か問題があるということだ。
(といっても"%VS80COMNTOOLS%vsvars32.bat"を実行した後にconfigure〜nmakeしただけなんだよなぁ)
このままartonさん提供のバイナリを使わせて貰えば良いのだろうが、それでは自分でビルドした意味が無い。この原因は必ず突き止めようと思う。

追記:
最初からやってみよう。ということでrubyのコンパイル自体からやり直してみた。

コンパイル直後の状態、readlineをまだ組み込んでいない時にはirbは落ちないことを確認。

ランタイムに問題はなさげだ。
次はreadlineを組み込んだ状態で実行すると落ちることを確認。その後Visual Studioのデバッガでをrubyにアタッチしてみる。

crtexe.cからntdll.dllで落ちてるようだ。

ちょっと前進。

追記:
Visual Studioで採取したスタックトレースをメモ。明日はこれを頼りに更に調べてみよう。

 	ntdll.dll!77247dfe() 	
 	[下のフレームは間違っているか、または見つかりません。ntdll.dll に対して読み込まれたシンボルはありません。]	
 	ntdll.dll!7728ee63() 	
 	ntdll.dll!77274c5a() 	
 	ntdll.dll!7726861f() 	
 	ntdll.dll!7724323c() 	
 	msvcrt.dll!768e7bbc() 	
 	msvcrt.dll!768bd0be() 	
 	readline.dll!02b2172f() 	
 	readline.dll!02b1e1c7() 	
 	readline.dll!02b1d658() 	
 	kernel32.dll!76692f97() 	
 	readline.dll!02b11189() 	
 	readline.dll!02b1145d() 	
 	readline.dll!02b110b6() 	
 	msvcrt-ruby18.dll!_rb_protect()  + 0x89 バイト	C
 	readline.so!_Init_readline()  - 0xca8 バイト	C
 	msvcrt-ruby18.dll!_rb_with_disable_interrupt()  + 0x11c バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x4a5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x241f バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x59a バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x248b バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x59a バイト	C
 	msvcrt-ruby18.dll!_rb_need_block()  + 0x5aa バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xf7e バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x119c バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xd9e バイト	C
 	msvcrt-ruby18.dll!_rb_need_block()  + 0x5aa バイト	C
 	msvcrt-ruby18.dll!_rb_mod_module_exec()  + 0x2c1 バイト	C
 	msvcrt-ruby18.dll!_rb_proc_call()  + 0x14 バイト	C
 	msvcrt-ruby18.dll!_rb_with_disable_interrupt()  + 0x110 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x4a5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x241f バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x59a バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xa5f バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x241f バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x344 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x33d5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x241f バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x103e バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xa5f バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x241f バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1788 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1235 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x235d バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1235 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xb18 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x248b バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x59a バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x103e バイト	C
 	msvcrt-ruby18.dll!_rb_need_block()  + 0x5aa バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x5f バイト	C
 	msvcrt-ruby18.dll!_rb_rescue2()  + 0x110 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xc8 バイト	C
 	msvcrt-ruby18.dll!_rb_with_disable_interrupt()  + 0x126 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x4a5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xd9e バイト	C
 	msvcrt-ruby18.dll!_rb_need_block()  + 0x5aa バイト	C
 	msvcrt-ruby18.dll!_Init_Proc()  + 0x711 バイト	C
 	msvcrt-ruby18.dll!_rb_with_disable_interrupt()  + 0x133 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x4a5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xd9e バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xd9e バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_need_block()  + 0x5aa バイト	C
 	msvcrt-ruby18.dll!_Init_Proc()  + 0x711 バイト	C
 	msvcrt-ruby18.dll!_rb_with_disable_interrupt()  + 0x133 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x4a5 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1b60 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0xd9e バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x9ac バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0xdde バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x1977 バイト	C
 	msvcrt-ruby18.dll!_rb_iter_break()  + 0x38e4 バイト	C
 	msvcrt-ruby18.dll!_ruby_run()  + 0x26 バイト	C
 	msvcr80.dll!71f437e4() 	
>	ruby.exe!__tmainCRTStartup()  行 597 + 0x17 バイト	C
 	kernel32.dll!766b4911() 	
 	ntdll.dll!7723e4b6() 	
 	ntdll.dll!7723e489()