aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2015-07-14 10:10:50 +0100
committerPedro Alves <palves@redhat.com>2015-07-14 10:10:50 +0100
commit586b02a96f744497c8921a558f1c386287849ab0 (patch)
treeed317d05b0d418b728f900dd089ae01c0cf74698 /gdb/gdbserver
parent05e83eb1b6a69c34b2fc5ab5e2dc14119145e49d (diff)
downloadgdb-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/gdbserver')
-rw-r--r--gdb/gdbserver/ChangeLog5
-rw-r--r--gdb/gdbserver/linux-low.c5
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,