Bug #4870

forkのテストが非常にまれに失敗する

Added by Motohiro KOSAKI about 4 years ago. Updated over 3 years ago.

[ruby-dev:43738]
Status:Rejected
Priority:Normal
Assignee:Motohiro KOSAKI
ruby -v:ruby 1.9.3dev (2011-06-11 trunk 31991) [x86_64-darwin10.7.4] Backport:

Description

MacOS Xでmake check すると一度だけ以下のテストが fail しました。


#236 test_fork.rb:30:in `':
begin
if pid1 = fork
sleep 1
Process.kill("USR1", pid1)
_, s = Process.wait2(pid1)
s.success? ? :ok : :ng
else
if pid2 = fork
trap("USR1") { Time.now.to_s }
Process.wait2(pid2)
else
sleep 2
end
exit 0
end
rescue NotImplementedError
:ok
end
#=> "main_thread: run, sig: 30\nsignal-hand: sig: 30\nok" (expected "ok")
FAIL 1/934 tests failed
make: *** [yes-btest-ruby] Error 1
[1] 22511 exit 2 make check OPTS="-v" TESTS="-v -q -j8 "
~/ruby% make test-all OPTS="-v" TESTS="-v -q -j8 "
./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- "./test/runner.rb" --ruby="./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext --" -v -q -j8

Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext --" -v -q -j8

採取されたバックトレースは以下


Process: ruby-193 [28604]
Path: /Users/kosaki/ruby/ruby-193
Identifier: ruby-193
Version: ??? (???)
Code Type: X86-64 (Native)
Parent Process: ruby-193 [26880]

Date/Time: 2011-06-11 15:03:23.827 +0900
OS Version: Mac OS X 10.6.7 (10J4138)
Report Version: 6

Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread: 0 Dispatch queue: com.apple.main-thread

Application Specific Information:
abort() called

Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 libSystem.B.dylib 0x00007fff885225d6 _kill + 10
1 libSystem.B.dylib 0x00007fff885c2cde abort + 83
2 ruby-193 0x0000000100037e92 rb_bug_errno + 0
3 ruby-193 0x00000001000fc3ca signal_exec + 0
4 libSystem.B.dylib 0x00007fff8853466a sigtramp + 26
5 libSystem.B.dylib 0x00007fff885225d6 __kill + 10
6 ruby-193 0x00000001000fbfcb rb_f_kill + 673
7 ruby-193 0x0000000100175428 call
cfunc + 282
8 ruby-193 0x000000010017528f vm_call_cfunc + 284
9 ruby-193 0x0000000100174458 vm
call_method + 373
10 ruby-193 0x000000010016efba vm_exec_core + 11449
11 ruby-193 0x000000010017ed92 vm_exec + 147
12 ruby-193 0x000000010017f765 rb_iseq_eval_main + 45
13 ruby-193 0x000000010003ccfb ruby_exec_internal + 193
14 ruby-193 0x000000010003ce1f ruby_exec_node + 30
15 ruby-193 0x000000010003cdf2 ruby_run_node + 56
16 ruby-193 0x0000000100000953 main + 79 (main.c:40)
17 ruby-193 0x00000001000008fc start + 52

Thread 1:
0 libSystem.B.dylib 0x00007fff8850ef8a _semwait_signal + 10
1 libSystem.B.dylib 0x00007fff88512da1 pthread_cond_wait + 1286
2 ruby-193 0x0000000100182a82 native
cond_timedwait + 37
3 ruby-193 0x0000000100183431 thread
timer + 121
4 libSystem.B.dylib 0x00007fff8850d4f6 pthread_start + 331
5 libSystem.B.dylib 0x00007fff8850d3a9 thread
start + 13

Thread 0 crashed with X86 Thread State (64-bit):
rax: 0x0000000000000000 rbx: 0x0000000000000001 rcx: 0x000000010035c948 rdx: 0x0000000000000000
rdi: 0x0000000000006fbc rsi: 0x0000000000000006 rbp: 0x000000010035c960 rsp: 0x000000010035c948
r8: 0x00007fff70f2da40 r9: 0x0000000000000000 r10: 0x00007fff8851e616 r11: 0xffffff80002e4730
r12: 0x0000000000000000 r13: 0x0000000000000000 r14: 0x0000000100493b48 r15: 0x00000001005ffef8
rip: 0x00007fff885225d6 rfl: 0x0000000000000202 cr2: 0x000000010035afd8

Binary Images:
0x100000000 - 0x100225fe7 +ruby-193 ??? (???) /Users/kosaki/ruby/ruby-193
0x100362000 - 0x100363fff +encdb.bundle ??? (???) /Users/kosaki/ruby/.ext/x86_64-darwin10.7.4/enc/encdb.bundle
0x100366000 - 0x100367fff +transdb.bundle ??? (???) /Users/kosaki/ruby/.ext/x86_64-darwin10.7.4/enc/trans/transdb.bundle
0x7fff5fc00000 - 0x7fff5fc3bdef dyld 132.1 (???) /usr/lib/dyld
0x7fff805a7000 - 0x7fff8065dfff libobjc.A.dylib 227.0.0 (compatibility 1.0.0) /usr/lib/libobjc.A.dylib
0x7fff862ec000 - 0x7fff862f0ff7 libmathCommon.A.dylib 315.0.0 (compatibility 1.0.0) /usr/lib/system/libmathCommon.A.dylib
0x7fff86677000 - 0x7fff866f4fef libstdc++.6.dylib 7.9.0 (compatibility 7.0.0) /usr/lib/libstdc++.6.dylib
0x7fff884d3000 - 0x7fff88694fff libSystem.B.dylib 125.2.10 (compatibility 1.0.0) /usr/lib/libSystem.B.dylib
0x7fff88789000 - 0x7fff887d5fff libauto.dylib ??? (???) /usr/lib/libauto.dylib
0x7fffffe00000 - 0x7fffffe01fff libSystem.B.dylib ??? (???) /usr/lib/libSystem.B.dylib

History

#1 Updated by Hiroshi Nakamura about 4 years ago

  • Assignee set to Motohiro KOSAKI

振り損ねていたようです。たぶん他に誰にも拾えないので処遇をお任せします。

#2 Updated by Motohiro KOSAKI about 4 years ago

  • Status changed from Open to Assigned
  • Target version changed from 1.9.3 to 2.0.0

ああ、担当者を設定し忘れていましたか。すいません。
ええと、ちょっと原因不明すぎて193に間に合う気がしないので遺憾ながら 1.9.x に設定しました。

以下調査状況

Macのlibcまわりのコードを読んだ感じだと sigtramp はシグナルハンドラの本体
(というかユーザが登録いた本物のシグナルハンドラとsigreturnを呼ぶラッパ)なのでシグナルを
受信したんだろうな。と
で、シグナルハンドラの延長で signal_exec() が呼ばれているのはあからさまにおかしいので
メモリ破壊か、最適化の影響でバックトレースが取れなかったかなんですが、ソース見ると
signal
exec()から直接 rb_bug_errno() を呼ぶルートがなさそうなので最適化の影響を疑っています。

なので、rb_bug_errno()を呼んでるあたりのどこかでEINTR処理を追加したら良さそうなんですが、はてさて

#3 Updated by Motohiro KOSAKI over 3 years ago

  • Status changed from Assigned to Rejected

だめ。
二度と再現できない。自己クローズします

Also available in: Atom PDF