Bug 18717 - gdb misbehaves if non-leader thread exits process
Summary: gdb misbehaves if non-leader thread exits process
Status: NEW
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 19424 (view as bug list)
Depends on:
Blocks:
 
Reported: 2015-07-24 17:18 UTC by Pedro Alves
Modified: 2016-07-15 17:06 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Pedro Alves 2015-07-24 17:18:01 UTC
This affects both the native backend and gdbserver.

If a non-leader thread exits the process while all other threads are ptrace-stopped, native gdb internal-errors.

I'm adding a test to the testsuite that catches this:

/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)
Comment 1 Pedro Alves 2015-07-24 17:18:21 UTC
And then even with that fixed, both native and gdbserver still misbehave in the same way:

(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/NNN)
Comment 2 Sourceware Commits 2015-07-24 17:29:22 UTC
The master branch has been updated by Pedro Alves <palves@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7759842763d94dc2f1c7d52d09f9203830b753ab

commit 7759842763d94dc2f1c7d52d09f9203830b753ab
Author: Pedro Alves <palves@redhat.com>
Date:   Fri Jul 24 18:18:44 2015 +0000

    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.
Comment 3 Pedro Alves 2016-01-04 15:41:53 UTC
*** Bug 19424 has been marked as a duplicate of this bug. ***