[PATCH] PR threads/20743: Don't attempt to suspend or resume exited threads.

Vasil Dimov vd@FreeBSD.org
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,
it hangs:

  --- cut ---
  Thread 1 received signal SIGINT, Interrupt.
  [Switching to LWP 100746 of process 3453]
  0x0000000804e59c7a in _poll () from /lib/libc.so.7
  (gdb) q
  A debugging session is active.

  	Inferior 1 [process 3453] will be killed.

  Quit anyway? (y or n) y

  (hangs here)
  --- cut ---

It has hung here:

  --- cut ---
  (top-gdb) bt
  #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>)
      at /usr/src/lib/libthr/thread/thr_syscalls.c:563
  #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.

Vasil Dimov
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...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20161228/19848da6/attachment.sig>

More information about the Gdb-patches mailing list