diff options
author | Pedro Alves <palves@redhat.com> | 2015-07-14 10:10:50 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2015-07-14 10:10:50 +0100 |
commit | 586b02a96f744497c8921a558f1c386287849ab0 (patch) | |
tree | ed317d05b0d418b728f900dd089ae01c0cf74698 /gdb | |
parent | 05e83eb1b6a69c34b2fc5ab5e2dc14119145e49d (diff) | |
download | gdb-586b02a96f744497c8921a558f1c386287849ab0.zip gdb-586b02a96f744497c8921a558f1c386287849ab0.tar.gz gdb-586b02a96f744497c8921a558f1c386287849ab0.tar.bz2 |
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 <palves@redhat.com>
* linux-low.c (kill_wait_lwp): Don't assert if waitpid fails.
Instead, ignore ECHILD, and throw an error for other errnos.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 5 |
2 files changed, 9 insertions, 1 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index e87d7b9..960b994 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-07-14 Pedro Alves <palves@redhat.com> + + * linux-low.c (kill_wait_lwp): Don't assert if waitpid fails. + Instead, ignore ECHILD, and throw an error for other errnos. + 2015-07-10 Pedro Alves <palves@redhat.com> * event-loop.c (struct callback_event) <data>: Change type to diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 7bb9f7f..2dafb03 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, |