[PATCH] PR threads/20743: Don't attempt to suspend or resume exited threads.
Wed Dec 28 08:07:00 GMT 2016
On Tue, Dec 27, 2016 at 13:03:27 -0800, John Baldwin wrote:
> I have tried changing fbsd_wait() to return a TARGET_WAITKIND_SPURIOUS
> instead of explicitly continuing the process, but that doesn't help, and it
> means that the ptid being returned is still T1 in that case.
> I'm not sure if I should explicitly be calling delete_exited_threads() in
> fbsd_resume() before calling iterate_threads()? Alternatively, fbsd_resume()
> could use ALL_NONEXITED_THREADS() instead of iterate_threads() (it isn't
> clear to me which of these is preferred since both are in use).
> I added the assertion for my own sanity. I suspect gdb should never try to
> invoke target_resume() with a ptid of an exited thread, but if for some
> reason it did the effect on FreeBSD would be a hang since we would suspend
> all the other threads and when the process was continued via PT_CONTINUE it
> would have nothing to do and would never return from wait(). I'd rather have
> gdb fail an assertion in that case rather than hang.
I am not sure if this is related, but since I get a hang I would rather
mention it: with the John's patch (including the assert) gdb does not
emit the "ptrace: No such process" error, but when I attempt to quit,
--- cut ---
Thread 1 received signal SIGINT, Interrupt.
[Switching to LWP 100746 of process 3453]
0x0000000804e59c7a in _poll () from /lib/libc.so.7
A debugging session is active.
Inferior 1 [process 3453] will be killed.
Quit anyway? (y or n) y
--- cut ---
It has hung here:
--- cut ---
#0 0x0000000803526df8 in _wait4 () from /lib/libc.so.7
During symbol reading, cannot get low and high bounds for subprogram DIE at 76931.
During symbol reading, incomplete CFI data; unspecified registers (e.g., rax) at 0x803a53a8e.
#1 0x0000000803a53abc in __thr_wait4 (pid=3453, pid@entry=<optimized out>,
status=0x7fffffffe304, status@entry=<optimized out>, options=0,
options@entry=<optimized out>, rusage=0x0, rusage@entry=<optimized out>)
#2 0x0000000000540d85 in inf_ptrace_mourn_inferior(target_ops*) ()
#3 0x000000000067c28f in target_mourn_inferior() ()
#4 0x0000000000540c6d in inf_ptrace_kill(target_ops*) ()
#5 0x000000000072769a in kill_or_detach(inferior*, void*) ()
#6 0x000000000074bdc9 in iterate_over_inferiors(int (*)(inferior*, void*), void*) ()
#7 0x00000000007272b2 in quit_force(char*, int) ()
#8 0x0000000000576f74 in cmd_func(cmd_list_element*, char*, int) ()
#9 0x000000000072698d in execute_command(char*, int) ()
#10 0x000000000065b2d0 in command_line_handler(char*) ()
#11 0x000000000065aaf2 in gdb_rl_callback_handler(char*) ()
#12 0x0000000801c41d7a in rl_callback_read_char () from /usr/local/lib/libreadline.so.6
#13 0x000000000065a880 in gdb_rl_callback_read_char_wrapper(void*) ()
#14 0x000000000065ae80 in stdin_event_handler(int, void*) ()
#15 0x0000000000659cf3 in gdb_wait_for_event(int) ()
#16 0x00000000006598a3 in gdb_do_one_event() ()
#17 0x0000000000659df0 in start_event_loop() ()
#18 0x0000000000654c5c in captured_command_loop(void*) ()
#19 0x0000000000650037 in catch_errors(int (*)(void*), void*, char*, return_mask) ()
#20 0x0000000000654696 in gdb_main(captured_main_args*) ()
#21 0x0000000000408643 in main ()
--- cut ---
Calling delete_exited_threads before iterate_over_threads in fbsd_resume
does not fix the hang.
inf_ptrace_mourn_inferior calls waitpid and it hangs on the pid of the
program being debugged, which is in TX state:
T Marks a stopped process.
X The process is being traced or debugged.
People can be divided into three groups:
Those who make things happen,
Those who watch things happen and
Those who wonder what happened.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 195 bytes
Desc: not available
More information about the Gdb-patches