ルギア君の戯言

雑多な記事。

Ruby バグ?

CentOS 6.3。CentOS 5.4、CentOS 5.6 でも発症する。再現性取れなさそうなぐらい奇怪な現象が発生してます。

とりあえずメモ程度。

症状

初期化の時点 (標準入力を読み始める前) で LoadError が発生する。内容は起動するたびに変わる。

$ /usr/bin/ruby19
/usr/bin/ruby19: No such file or directory -- �B (LoadError)
$ /usr/bin/ruby19                     
/usr/bin/ruby19: No such file or directory --  (LoadError)  
$ /usr/bin/ruby19                     
/usr/bin/ruby19: No such file or directory -- ��M (LoadError)
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory --@� (LoadError)  
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory --0� (LoadError)  
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory -- (LoadError)    
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory -- �o) (LoadError)
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory --  (LoadError)   
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory -- � (LoadError)  
$ /usr/bin/ruby19                      
/usr/bin/ruby19: No such file or directory -- ▒ (LoadError)  

バイナリ的な部分が出てるので inspect させるとこんな感じ。

$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \u001A (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory --  (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory --  (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \xE8\u000F \u0001 (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \xE8\u007F6\u0002 (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \u001A (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory --  (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \b \xDC (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory --  (LoadError)\n"
$ /usr/bin/ruby19 2>&1 | ruby -e "ARGF.each { |d| puts d.inspect }"
"/usr/bin/ruby19: No such file or directory -- \b \xF0 (LoadError)\n"

-e オプションで起動すると LoadError ではなく TypeError になる。(別のバグかもしれない)

$ ruby19 -e ''
ruby19: wrong argument type Object (expected Data) (TypeError)

--help は正常に終了する。

$ ruby19 --help
Usage: ruby19 [switches] [--] [programfile] [arguments]
  -0[octal]       specify record separator (\0, if no argument)
  -a              autosplit mode with -n or -p (splits $_ into $F)
  -c              check syntax only
  -Cdirectory     cd to directory, before executing your script
(snip)
  -W[level=2]     set warning level; 0=silence, 1=medium, 2=verbose
  -x[directory]   strip off text before #!ruby line and perhaps cd to directory
  --copyright     print the copyright
  --version       print the version

バージョン情報

$ ruby19 -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
スレッドモデル: posix
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)

発現するタイミング

不明

  • インストールしたての頃は問題なく動作するが、半日から1日経って起動すると発現するようになる。
  • インストールしなおせば解消される (リビルドも不要)。が、また半日か経つと発現する。

回避方法

その他

  • Shared library を使った場合はどうなるかは不明 (上はどちらも static linked な ruby と ruby19)
  • ECC メモリの効果はない模様 (上のログは非 ECC だが、ECC の 5.6 でも発症した)。
  • -g まではやる暇がなかった。
  • 単純にビルドに失敗している…のかも。
  • 2.0.0dev で発現するかも不明
  • Momonga Linux での -O3 でビルドしたものについて発症するかどうかを誰か見たとは思うが、僕はその結果を知らないし、自分で試してもない。