From: Tomoyuki Chikanaga Date: 2010-11-05T19:40:46+09:00 Subject: [ruby-dev:42540] [Ruby 1.9-Bug#4027][Open] Signal.trap で busy loop に陥る --mimepart_4cd3defc547b7_ef0d5cf47e28034 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: Quoted-printable Content-Disposition: inline Bug #4027: Signal.trap で busy loop に陥る http://redmine.ruby-lang.org/issues/show/4027 起票者: Tomoyuki Chikanaga ステータス: Open, 優先度: Normal カテゴリ: core ruby -v: ruby 1.9.3dev (2010-10-29 trunk 29626) [i686-linux] Signal.trap のシグナルハンドラ内で Mutex(Monitor) を用いる調査をしていて 稀にインタプリタが CPU を占有して busy loop 状態になることがありました。 あまり小さく絞れていませんが再現させたスクリプトを添付します。 元々はこれで時々 ThreadError: deadlock; recursive locking になるのを 避ける方法を考えるために実験していたのですが、ごく稀にインタプリタが止まり、 gdb attach すると下記のスタックトレースを得ました。 環境は Red Hat Enterprise Linux ES release 3 (Taroon Update 8) Linux 2.4.21-47.ELsmp #1 SMP Wed Jul 5 20:38:41 EDT 2006 i686 i686 i386 GNU/Linux です。 また signal_buff という変数の内容がおかしいと思い表示させてみると (gdb) p signal_buff $1 = {cnt = {0 }, size = -1} のように signal_buff.size がアンダーフローしているようです。 sighandler() で signal_buff.cnt[sig] と signal_buff.size を increment しているところを rb_disable_interrupt() で保護しないといけないのでしょうか? そのようなパッチを当てて追試してみて今のところ再現していませんが、 元々なかなか起きていなかったので直ったのかははっきりしません。 (gdb) where #0 0x00cb3007 in sched_yield () from /lib/tls/libc.so.6 #1 0x081524fc in rb_threadptr_execute_interrupts_rec (th=0x83da590, sched_depth=0) at thread.c:1253 #2 0x081526d7 in rb_threadptr_execute_interrupts (th=0x83da590) at thread.c:1318 #3 0x0814819c in vm_call0 (th=0x83da590, recv=0, id=792, argc=0, argv=0x0, me=0x84140a8) at vm_eval.c:146 #4 0x08148f19 in rb_call0 (recv=0, mid=792, argc=0, argv=0x0, scope=CALL_FCALL, self=6) at vm_eval.c:235 #5 0x08148e6c in rb_call (recv=0, mid=792, argc=0, argv=0x0, scope=CALL_FCALL) at vm_eval.c:438 #6 0x08148fb8 in rb_funcall (recv=0, mid=792, n=0) at vm_eval.c:637 #7 0x0808c997 in rb_obj_inspect (obj=0) at object.c:442 #8 0x08144949 in call_cfunc (func=0x808c83d , recv=0, len=0, argc=0, argv=0x0) at vm_insnhelper.c:319 #9 0x08147e8a in vm_call0 (th=0x83da590, recv=0, id=800, argc=0, argv=0x0, me=0x8410700) at vm_eval.c:79 #10 0x08148f19 in rb_call0 (recv=0, mid=800, argc=0, argv=0x0, scope=CALL_FCALL, self=6) at vm_eval.c:235 #11 0x08148e6c in rb_call (recv=0, mid=800, argc=0, argv=0x0, scope=CALL_FCALL) at vm_eval.c:438 #12 0x08148fb8 in rb_funcall (recv=0, mid=800, n=0) at vm_eval.c:637 #13 0x0808c5cf in rb_inspect (obj=0) at object.c:356 #14 0x0807811d in rb_p (obj=0) at io.c:6196 #15 0x08078279 in rb_f_p (argc=1, argv=0xb7282028, self=138456320) at io.c:6234 #16 0x08144936 in call_cfunc (func=0x8078245 , recv=138456320, len=-1, argc=1, argv=0xb7282028) at vm_insnhelper.c:316 #17 0x08144821 in vm_call_cfunc (th=0x83da590, reg_cfp=0xb7301f84, num=1, recv=138456320, blockptr=0x0, me=0x84461f0) at vm_insnhelper.c:403 #18 0x08143f49 in vm_call_method (th=0x83da590, cfp=0xb7301f84, num=1, blockptr=0x0, flag=8, id=6160, me=0x84461f0, recv=138456320) at vm_insnhelper.c:525 #19 0x0814122d in vm_exec_core (th=0x83da590, initial=0) at insns.def:1006 #20 0x0814d1f4 in vm_exec (th=0x83da590) at vm.c:1142 #21 0x0814db49 in rb_iseq_eval_main (iseqval=138364160) at vm.c:1383 #22 0x0805c74d in ruby_exec_internal (n=0x83f4500) at eval.c:214 #23 0x0805c858 in ruby_exec_node (n=0x83f4500) at eval.c:261 #24 0x0805c82c in ruby_run_node (n=0x83f4500) at eval.c:254 #25 0x0805b190 in main (argc=2, argv=0xbfffa164) at main.c:35 ---------------------------------------- http://redmine.ruby-lang.org --mimepart_4cd3defc547b7_ef0d5cf47e28034 Content-Type: application/octet-stream; name=sigchldtest.rb Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=sigchldtest.rb cmVxdWlyZSAibW9uaXRvciIKCmNsYXNzIFRlc3QKICBpbmNsdWRlIE1vbml0 b3JNaXhpbgoKICBkZWYgaW5pdGlhbGl6ZQogICAgbW9uX2luaXRpYWxpemUK ICAgIEBjb25kID0gbmV3X2NvbmQKICAgIEBmbGFnID0gZmFsc2UKICAgIEB0 aHJlYWQgPSBuaWwKICBlbmQKCiAgYXR0cl9yZWFkZXIgOmZsYWcKCiAgZGVm IHN0YXJ0CiAgICBAdGhyZWFkID0gVGhyZWFkLnN0YXJ0IGRvCiAgICAgIHN5 bmNocm9uaXplIGRvCiAgICAgICAgd2hpbGUgdHJ1ZQogICAgICAgICAgQGNv bmQud2FpdF91bnRpbHsgQGZsYWcgfQogICAgICAgICAgQGZsYWcgPSBmYWxz ZQogICAgICAgICAgYmVnaW4KICAgICAgICAgICAgd2hpbGUgdHJ1ZQogICAg ICAgICAgICAgIFByb2Nlc3Mud2FpdAogICAgICAgICAgICBlbmQKICAgICAg ICAgIHJlc2N1ZSBFcnJubzo6RUNISUxECiAgICAgICAgICBlbmQKICAgICAg ICBlbmQKICAgICAgZW5kCiAgICBlbmQKICBlbmQKCiAgZGVmIHNldF9zaWdu YWxfaGFuZGxlcgogICAgU2lnbmFsLnRyYXAoOkNITEQpIGRvCiAgICAgIHN5 bmNocm9uaXplIGRvCiAgICAgICAgQGZsYWcgPSB0cnVlCiAgICAgICAgQGNv bmQuc2lnbmFsCiAgICAgIGVuZAogICAgZW5kCiAgZW5kCmVuZAoKbyA9IFRl c3QubmV3Cm8uc2V0X3NpZ25hbF9oYW5kbGVyCm8uc3RhcnQKCndoaWxlIHRy dWUKICAxMDAwLnRpbWVzIGRvCiAgICBQcm9jZXNzLnNwYXduKCJscyA+IC9k ZXYvbnVsbCIpCiAgZW5kCiAgc2xlZXAgMQogIHAgby5mbGFnCmVuZAoK --mimepart_4cd3defc547b7_ef0d5cf47e28034--