FreeBSD deadlock (with fork?)

Julian Elischer julian at elischer.org
Thu Sep 18 17:46:03 UTC 2008


David Naylor wrote:
> Hi,
> 
> I have a program that spawns a lot of subprocesses (with pipes open) from 
> multiple threads.  The problem is the program often deadlocks, but not 
> consistently.  Sometimes the program can run over 5 times to competition 
> without incidence and yet othertimes it locks within a few seconds.  

you sent this to -current. Is it in -current? (we fixed something like 
this some months back in current and 7)

do your post-fork processes do an exec?  according to the spec they 
should.

if any of your threads other than the one that did the fork ho;ds any 
mutex at teh time of fork then your process will hang. If they hold a 
umtx (between processes) then everything will hang.



> 
> However if I limit the thread count to 1 the problem does not appear to be 
> present.  
> 
> Here are the logs from gdb:
> (gdb) info thread
>   5 Thread 7021c0 (LWP 100203)  0x00000008009a2e8c in _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
>   4 Thread a28480 (LWP 100174)  0x00000008009a2e8c in _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
>   3 Thread a61d80 (LWP 100175)  0x00000008009a2e8c in _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
>   2 Thread a61bc0 (LWP 100176)  0x00000008009a2e8c in _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
> * 1 Thread a61840 (LWP 100177)  0x00000008009a2e8c in _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
> 
> 
> (gdb) bt
> #0  0x00000008009a2e8c in _umtx_op_err () 
> at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
> #1  0x00000008009a1331 in cond_wait_common (cond=Variable "cond" is not 
> available.
> ) at /usr/src/lib/libthr/thread/thr_cond.c:204
> #2  0x00000000004c0573 in PyThread_acquire_lock (lock=0x70a760, waitflag=1) at 
> thread_pthread.h:452
> #3  0x00000000004c38b0 in lock_PyThread_acquire_lock (self=0x83f258, 
> args=Variable "args" is not available.
> ) at ./Modules/threadmodule.c:46
> #4  0x00000000004939e3 in PyEval_EvalFrameEx (f=0xa53920, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3679
> #5  0x00000000004939a8 in PyEval_EvalFrameEx (f=0xb57420, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3765
> #6  0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x9aab70, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #7  0x00000000004eb6bc in function_call (func=0x9d8938, arg=0x9d9990, 
> kw=0xa24da0)
>     at Objects/funcobject.c:524
> #8  0x0000000000417add in PyObject_Call (func=0x9d8938, arg=0x9d9990, 
> kw=0xa24da0)
>     at Objects/abstract.c:2487
> #9  0x000000000048f730 in PyEval_EvalFrameEx (f=0xb48e20, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3978
> #10 0x00000000004939a8 in PyEval_EvalFrameEx (f=0xb57720, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3765
> #11 0x00000000004939a8 in PyEval_EvalFrameEx (f=0xb49020, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3765
> #12 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x947cd8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #13 0x00000000004eb5bd in function_call (func=0x9a5320, arg=0x9d9950, kw=0x0) 
> at Objects/funcobject.c:524
> #14 0x0000000000417add in PyObject_Call (func=0x9a5320, arg=0x9d9950, kw=0x0) 
> at Objects/abstract.c:2487
> #15 0x000000000041f12f in instancemethod_call (func=0x9a5320, arg=0x9d9950, 
> kw=0x0)
>     at Objects/classobject.c:2558
> #16 0x0000000000417add in PyObject_Call (func=0x93b410, arg=0x718050, kw=0x0) 
> at Objects/abstract.c:2487
> #17 0x000000000048d4c6 in PyEval_CallObjectWithKeywords (func=0x93b410, 
> arg=0x718050, kw=0x0)
>     at Python/ceval.c:3548
> #18 0x00000000004c3cbd in t_bootstrap (boot_raw=0x70ae60) 
> at ./Modules/threadmodule.c:425
> #19 0x000000080099ac11 in thread_start (curthread=0xa61840) 
> at /usr/src/lib/libthr/thread/thr_create.c:288
> #20 0x0000000000000000 in ?? ()
> Error accessing memory address 0x7fffff5fc000: Bad address.
> 
> 
> (gdb) thr 2
> [Switching to thread 2 (Thread a61bc0 (LWP 100176))]#0  0x00000008009a2e8c in 
> _umtx_op_err ()
>     at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
> 37      RSYSCALL_ERR(_umtx_op)
> (gdb) bt
> #0  0x00000008009a2e8c in _umtx_op_err () 
> at /usr/src/lib/libthr/arch/amd64/amd64/_umtx_op_err.S:37
> #1  0x00000008009a1331 in cond_wait_common (cond=Variable "cond" is not 
> available.
> ) at /usr/src/lib/libthr/thread/thr_cond.c:204
> #2  0x00000000004c0573 in PyThread_acquire_lock (lock=0x70a600, waitflag=1) at 
> thread_pthread.h:452
> #3  0x00000000004c38b0 in lock_PyThread_acquire_lock (self=0x83f168, 
> args=Variable "args" is not available.
> ) at ./Modules/threadmodule.c:46
> #4  0x00000000004939e3 in PyEval_EvalFrameEx (f=0xb56520, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3679
> #5  0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x8d5dc8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #6  0x0000000000492c88 in PyEval_EvalFrameEx (f=0xb2de20, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3775
> #7  0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x8d5288, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #8  0x00000000004eb5bd in function_call (func=0x9a8b18, arg=0xc524d0, kw=0x0) 
> at Objects/funcobject.c:524
> #9  0x0000000000417add in PyObject_Call (func=0x9a8b18, arg=0xc524d0, kw=0x0) 
> at Objects/abstract.c:2487
> #10 0x000000000041f12f in instancemethod_call (func=0x9a8b18, arg=0xc524d0, 
> kw=0x0)
>     at Objects/classobject.c:2558
> #11 0x0000000000417add in PyObject_Call (func=0x93b370, arg=0x10331d0, kw=0x0) 
> at Objects/abstract.c:2487
> #12 0x0000000000464158 in slot_tp_init (self=Variable "self" is not available.
> ) at Objects/typeobject.c:5532
> #13 0x0000000000461561 in type_call (type=0x7d9420, args=0x10331d0, kwds=0x0) 
> at Objects/typeobject.c:700
> #14 0x0000000000417add in PyObject_Call (func=0x7d9420, arg=0x10331d0, kw=0x0) 
> at Objects/abstract.c:2487
> #15 0x00000000004906f9 in PyEval_EvalFrameEx (f=0xb3a120, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3890
> #16 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x8d5eb8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #17 0x0000000000492c88 in PyEval_EvalFrameEx (f=0xa47a20, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3775
> #18 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x8d5cd8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #19 0x0000000000492c88 in PyEval_EvalFrameEx (f=0xb3a420, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3775
> #20 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x9aabe8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #21 0x0000000000492c88 in PyEval_EvalFrameEx (f=0xb3a720, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3775
> #22 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x9aab70, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #23 0x00000000004eb6bc in function_call (func=0x9d8938, arg=0x9d98d0, 
> kw=0xa5a660)
>     at Objects/funcobject.c:524
> #24 0x0000000000417add in PyObject_Call (func=0x9d8938, arg=0x9d98d0, 
> kw=0xa5a660)
>     at Objects/abstract.c:2487
> #25 0x000000000048f730 in PyEval_EvalFrameEx (f=0xb2e020, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3978
> ---Type <return> to continue, or q <return> to quit---
> #26 0x00000000004939a8 in PyEval_EvalFrameEx (f=0xb3aa20, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3765
> #27 0x00000000004939a8 in PyEval_EvalFrameEx (f=0xb2e220, 
> throwflag=Variable "throwflag" is not available.
> ) at Python/ceval.c:3765
> #28 0x0000000000494ac1 in PyEval_EvalCodeEx (co=0x947cd8, 
> globals=Variable "globals" is not available.
> ) at Python/ceval.c:2942
> #29 0x00000000004eb5bd in function_call (func=0x9a5320, arg=0x9d9890, kw=0x0) 
> at Objects/funcobject.c:524
> #30 0x0000000000417add in PyObject_Call (func=0x9a5320, arg=0x9d9890, kw=0x0) 
> at Objects/abstract.c:2487
> #31 0x000000000041f12f in instancemethod_call (func=0x9a5320, arg=0x9d9890, 
> kw=0x0)
>     at Objects/classobject.c:2558
> #32 0x0000000000417add in PyObject_Call (func=0x93b320, arg=0x718050, kw=0x0) 
> at Objects/abstract.c:2487
> #33 0x000000000048d4c6 in PyEval_CallObjectWithKeywords (func=0x93b320, 
> arg=0x718050, kw=0x0)
>     at Python/ceval.c:3548
> #34 0x00000000004c3cbd in t_bootstrap (boot_raw=0x70aee0) 
> at ./Modules/threadmodule.c:425
> #35 0x000000080099ac11 in thread_start (curthread=0xa61bc0) 
> at /usr/src/lib/libthr/thread/thr_create.c:288
> #36 0x0000000000000000 in ?? ()
> Error accessing memory address 0x7fffff7fd000: Bad address.
> 
> Apologies about the long backtraces [and thus the long message].  
> 
> Thanks
> 
> David



More information about the freebsd-current mailing list