[ruby-dev:49114] [Ruby trunk - Bug #11265] deadlock on Solaris 10 since r50900

From: ngotogenome@...
Date: 2015-06-18 16:52:12 UTC
List: ruby-dev #49114
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/

In This Thread

Prev Next