aboutsummaryrefslogtreecommitdiff
path: root/gdb/linux-nat.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2015-07-24 18:18:44 +0000
committerPedro Alves <palves@redhat.com>2015-07-24 17:49:17 +0100
commit7759842763d94dc2f1c7d52d09f9203830b753ab (patch)
treede2677fa09b21e64b63dc39db7c11816f1521b09 /gdb/linux-nat.c
parentfe23c31f262151ce3265f5b90870d40cb6840f0a (diff)
downloadgdb-7759842763d94dc2f1c7d52d09f9203830b753ab.zip
gdb-7759842763d94dc2f1c7d52d09f9203830b753ab.tar.gz
gdb-7759842763d94dc2f1c7d52d09f9203830b753ab.tar.bz2
PR gdb/18717: internal error if non-leader thread exits process
If a non-leader thread exits the process while all other threads are ptrace-stopped, native gdb fails an assertion. The test added by this commit catches it: /home/pedro/gdb/mygit/build/../src/gdb/linux-nat.c:3198: internal-error: linux_nat_filter_event: Assertion `lp->resumed' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) FAIL: gdb.threads/non-leader-exit-process.exp: program exits normally (GDB internal error) The fix is just to remove the assertion. With that out of the way, neither GDB not GDBserver handle this perfectly though, so I'm adding a KFAIL: (gdb) continue Continuing. [Thread 0x7ffff7fc0700 (LWP 15350) exited] No unwaited-for children left. Couldn't get registers: No such process. (gdb) KFAIL: gdb.threads/non-ldr-exit.exp: program exits normally (PRMS: gdb/18717) gdb/ChangeLog: 2015-07-24 Pedro Alves <palves@redhat.com> PR gdb/18717 * linux-nat.c (linux_nat_filter_event): Don't assert that the lwp is resumed, and extend the debug log. gdb/testsuite/ChangeLog: 2015-07-24 Pedro Alves <palves@redhat.com> PR gdb/18717 * gdb.threads/non-ldr-exit.c: New file. * gdb.threads/non-ldr-exit.exp: New file.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r--gdb/linux-nat.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index e383d8a..b33abb0 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -3195,12 +3195,14 @@ linux_nat_filter_event (int lwpid, int status)
}
}
- gdb_assert (lp->resumed);
-
+ /* Note that even if the leader was ptrace-stopped, it can still
+ exit, if e.g., some other thread brings down the whole
+ process (calls `exit'). So don't assert that the lwp is
+ resumed. */
if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog,
- "Process %ld exited\n",
- ptid_get_lwp (lp->ptid));
+ "Process %ld exited (resumed=%d)\n",
+ ptid_get_lwp (lp->ptid), lp->resumed);
/* This was the last lwp in the process. Since events are
serialized to GDB core, we may not be able report this one