From: ngotogenome@... Date: 2015-06-18T16:52:12+00:00 Subject: [ruby-dev:49114] [Ruby trunk - Bug #11265] deadlock on Solaris 10 since r50900 Issue #11265 has been updated by Naohisa Goto. vforkは "The parent process is suspended while the child is using its resources." (Solaris 10 の man vfork(2) より引用) なので、vfork で作成された子プロセス側の execv が完了する前に止まっているのが直接の原因のようです。 そして、子プロセス側の frame 6 で execv を呼び出しているはずなのに、なぜそこから frame 5 では rb_close_before_exec が呼び出されているのかは、私は理解できていません。 atfork 的な処理がどこかで登録されているのでしょうか? 下記は子プロセス側のdbxの抜粋です。 ~~~ (dbx) frame 6 Current function is proc_exec_cmd 1269 execv(prog, argv); /* async-signal-safe */ (dbx) print prog prog = 0x100868980 "/XXXXX-trunk/bin/ruby" (dbx) print argv[0] argv[0] = 0x10083ca40 "/XXXXX-trunk/bin/ruby" (dbx) print argv[1] argv[1] = 0x10083ca8a "/YYYYY/test/lib/test/unit/parallel.rb" (dbx) print argv[2] argv[2] = 0x10083cade "--ruby" (dbx) print argv[3] argv[3] = 0x10083cae5 "/XXXXX-trunk/bin/ruby" (dbx) print argv[4] argv[4] = 0x10083cb2f "-j" (dbx) print argv[5] argv[5] = 0x10083cb32 "t1" (dbx) print argv[6] argv[6] = 0x10083cb35 "--jobs-status" (dbx) print argv[7] argv[7] = (nil) (dbx) frame 5 Current function is rb_close_before_exec 5870 ret = fcntl(fd, F_GETFD); /* async-signal-safe */ (dbx) ~~~ ---------------------------------------- Bug #11265: deadlock on Solaris 10 since r50900 https://bugs.ruby-lang.org/issues/11265#change-53023 * Author: Naohisa Goto * Status: Open * Priority: Normal * Assignee: * ruby -v: - * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- Solaris10にて、r50900 以降、 TestParallel::TestParallel#test_jobs_status TestParallel::TestParallel#test_separate のいずれか、または両方で、テストが停止状態となり次に進まなくなります。 スレッドのデッドロックが発生しているような感じです。 ところで、こういう場合の上手いデバッグ方法って何があるでしょうか? -- https://bugs.ruby-lang.org/