From: Toshio Maki Date: 2010-03-18T14:57:34+09:00 Subject: [ruby-dev:40694] Ruby+SWIGでGC実行時に不正なマークをしている可能性があります --------_4BA1B6CD00000000AF02_MULTIPART_MIXED_ Content-Type: text/plain; charset="ISO-2022-JP" Content-Transfer-Encoding: 7bit  初めまして。牧と申します。  Ruby+SWIGを用いたプログラムでSIGSEGVが発生するので、原因を調査していた のですが、gc_mark付近が怪しいので、報告させていただきます。 現象  SWIGでSTLをラップした関数を自動生成し、Ruby側から呼び出したときに、 SIGSEGVやNotImplementedErrorが発生します。 その1  SIGSEGVでアボートするケース。コアのスタックトレースは以下の通りです。 #0 0x000000337b030265 in raise () from /lib64/libc.so.6 #1 0x000000337b031d10 in abort () from /lib64/libc.so.6 #2 0x0000000000499878 in rb_bug (fmt=0x4b5f0d "Segmentation fault") at error.c:213 #3 0x00000000004706aa in sigsegv (sig=) at signal.c:634 #4 #5 st_lookup (table=0x0, key=3137, value=0x7fff3d254a40) at st.c:250 #6 0x0000000000411595 in search_method (klass=47793957212960, id=3137, origin=0x7fff3d254a78) at eval.c:486 #7 0x0000000000411607 in rb_get_method_body (klassp=0x7fff3d254ac0, idp=0x7fff3d254ac8, noexp=0x7fff3d254ad4) at eval.c:507 #8 0x000000000041c205 in rb_call (klass=47793957212960, recv=47793957213000, mid=3137, argc=0, argv=0x0, scope=1, self=6) at eval.c:6150 #9 0x000000000041c7e8 in vafuncall (recv=47793957213000, mid=3137, n=7219792, ar=) at eval.c:6253 #10 0x000000000041ca73 in rb_funcall (recv=0, mid=3137, n=1025854016) at eval.c:6270 その2  NotImplementedErrorが発生する。(添付のソースは以下の現象が発生) call_external_lib.rb:6:in `p': method `inspect' called on terminated object (0x2b1a83bc88d8) (NotImplementedError) from call_external_lib.rb:6 from call_external_lib.rb:5:in `each' from call_external_lib.rb:5 from call_external_lib.rb:4:in `each' from call_external_lib.rb:4  再現環境  gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-46)  ruby 1.8.7 (2009-12-24 patchlevel 249) [x86_64-linux]  SWIG Version 1.3.29 Compiled with g++ [i686-redhat-linux-gnu]  また環境依存のせいか、発生しないケースもあります。 ・再現した  Red Hat Enterprise Linux Server release 5.4 (Tikanga) x86_64  Ubuntu 09-10 32bit ・再現しない  CentOS release 5.4 (Final) 32bit 原因?  C側で生成したvectorのポインタをData_Wrap_structでRubyのVALUEに変換する 際に、rb_newobjがGCを呼ぶので、その際に呼ばれたgc_markやmark_tblが何かやっ ているのではないかと考えています。ruby側でGC.disableやC側でrb_gc_disable を実行しておくと発生しません。 類似?  同じ現象かどうかは分かりませんが、以前にも似たような報告があったようで す。 Segmentation fault in garbage collector ruby 1.8.7 (2008-10-31 revision 0) [x86_64-linux]  http://redmine.ruby-lang.org/issues/show/706 /***************************************************/ 日立ソフトウェアエンジニアリング株式会社 技術開発本部 Rubyセンタ 牧 俊男 /***************************************************/ --------_4BA1B6CD00000000AF02_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="gc_break.tar.gz" Content-Disposition: attachment; filename="gc_break.tar.gz" Content-Transfer-Encoding: base64 H4sIAKa9oUsAA+2XW2/aMBTHeY0/hQVDJGNluZAgNRRpU5E2qdrDNk17S3NxIBBCZpJ1Vct333G4 hsHSSQE61T8JBZ/jYzsc/33MwLUcSuzx28rxkIFOR2dPRVaU7eeKiqJouqxphiEbFfCpqlzB+hHX tCadJTbFuDKxx8Hf+hX5/1MGq/yTXwmhkR1aYeC0yn1TlmDDaB/Mf1tpr/IPDRXy35ZVvYLlUldx gBee//pk6qUhwav0o3oQuWHqEVydJZ71k7jJlLaCKqpH5G7qjKCNh+mALD0mQvWETOLQToh4PU2d kHzLHBKG8MvLRa+ul3l65oHO6nW++55Q3GNTPaDaenm5DTusbnlo6tznLN3FWD1Un2+93+4A6Ny5 OAfb+nenkd+iTulzFOlfMfQd/WuqrHD9nwJKfqQBJbgxGU/8BkK3s7tggC+YhPCF22zifF24Ra9u Pr7/gq+wHcck8piV2vRezMxvskMDoqoScmFXJcSCn434QUjExmqghvQihfZM2V//3TgucY4i/eta Z7f+awav/yfhCfWUlePM1kOosEq/3r4diNIDEp4QApYZEoQrDHeM4ouAKJlI8GH0IEpwAEeRbMKj ixW2l+Brs8mmFfbFQhNi18GjRfBoEzxaBgvQsxWns6Hl2O5YpHbkiZJkCuCao8w7u+ht/NBmiwIX JUlKo+yNTDR//ifdWv+uHYZWbg+UdhMorv/Gjv51pdPh+j8F6/q/Ls8Isc0LyugvLa2cos3M3SK2 O8TeFD9C6xFhgClmY7XDhZURY2hmLbgxIPY591tzVuyv/8NS5yjSvyqrW/rXFv//Za7/U1AL/Mgj Pras/vev/c+f3t1YcJO3PlgWqoE9iMhe1x//rP/5ZmCiGpwEgc/PAg6Hw+FwOBwOh8PhcDgcDudo /AarkuHXACgAAA== --------_4BA1B6CD00000000AF02_MULTIPART_MIXED_--