From: Pedro Alves Date: Tue, 14 Jul 2015 09:48:05 +0000 (+0100) Subject: gdbserver/Linux: internal error when killing a process that is already gone X-Git-Tag: gdb-7.10-release~76 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=68988aba52a4c6355b03834f70bcebbd114be2cd;p=thirdparty%2Fbinutils-gdb.git gdbserver/Linux: internal error when killing a process that is already gone If the process disappears (e.g., killed with "kill -9" from the shell) while it was stopped under GDBserver's control, and the GDBserver tries to kill it, GDBserver asserts: (gdb) shell kill -9 23084 (gdb) kill ... Killing process(es): 23084 /home/pedro/gdb/mygit/src/gdb/gdbserver/linux-low.c:972: A problem internal to GDBserver has been detected. kill_wait_lwp: Assertion `res > 0' failed. ... gdb/gdbserver/ChangeLog: 2015-07-14 Pedro Alves * linux-low.c (kill_wait_lwp): Don't assert if waitpid fails. Instead, ignore ECHILD, and throw an error for other errnos. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 081d3052cb2..33a90e64fd3 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-07-14 Pedro Alves + + * linux-low.c (kill_wait_lwp): Don't assert if waitpid fails. + Instead, ignore ECHILD, and throw an error for other errnos. + 2015-07-02 Markus Metzger * linux-low.c: Include "rsp-low.h" diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 7bb9f7f19fe..2dafb033bce 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1103,7 +1103,10 @@ kill_wait_lwp (struct lwp_info *lwp) res = my_waitpid (lwpid, &wstat, __WCLONE); } while (res > 0 && WIFSTOPPED (wstat)); - gdb_assert (res > 0); + /* Even if it was stopped, the child may have already disappeared. + E.g., if it was killed by SIGKILL. */ + if (res < 0 && errno != ECHILD) + perror_with_name ("kill_wait_lwp"); } /* Callback for `find_inferior'. Kills an lwp of a given process,