Here's a possible stack taken during the fork():
Thread 1 "python3" hit Breakpoint 1, 0x00007ffff7124734 in fork () from /lib64/libc.so.6
Thread 1814 (Thread 0x7fffe69d5700 (LWP 23574)):
#0 0x00007ffff7bc24e5 in __pthread_mutex_unlock_usercnt () from /lib64/libpthread.so.0
#1 0x00007ffff71928e3 in dl_iterate_phdr () from /lib64/libc.so.6
#2 0x00007fffe5fcfe55 in _Unwind_Find_FDE () from /lib64/libgcc_s.so.1
#3 0x00007fffe5fcc403 in uw_frame_state_for () from /lib64/libgcc_s.so.1
#4 0x00007fffe5fcd90f in _Unwind_ForcedUnwind_Phase2 () from /lib64/libgcc_s.so.1
#5 0x00007fffe5fcdf30 in _Unwind_ForcedUnwind () from /lib64/libgcc_s.so.1
#6 0x00007ffff7bc7712 in __pthread_unwind () from /lib64/libpthread.so.0
#7 0x00007ffff7bbf7e7 in pthread_exit () from /lib64/libpthread.so.0
#8 0x000000000051b2fc in PyThread_exit_thread () at Python/thread_pthread.h:238
#9 0x000000000055ed16 in t_bootstrap (boot_raw=0x7fffe8da0e40) at ./Modules/_threadmodule.c:1021
#10 0x00007ffff7bbe594 in start_thread () from /lib64/libpthread.so.0
#11 0x00007ffff7157e5f in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x7ffff7fca080 (LWP 20524)):
#0 0x00007ffff7124734 in fork () from /lib64/libc.so.6
#1 0x0000000000532c8a in os_fork_impl (module=<optimized out>) at ./Modules/posixmodule.c:5423
#2 os_fork (module=<optimized out>, _unused_ignored=<optimized out>) at ./Modules/clinic/posixmodule.c.h:1913
where, in my source code, dl_iterate_phdr() starts with something like:
/* Make sure nobody modifies the list of loaded objects. */
__rtld_lock_lock_recursive (GL(dl_load_write_lock));
i.e., when the fork occures, the non-fork thread has acquired dl_load_write_lock - the same lock that the child will later try to acquire (and hang)
no clue as to what that thread is doing though; other than it looks like it is trying to generate a backtrace? |