This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gdb and binutils branch gdb-7.8-branch updated. 768fbcfda81ff37027eb7a02c043ff669f7701fa


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gdb and binutils".

The branch, gdb-7.8-branch has been updated
       via  768fbcfda81ff37027eb7a02c043ff669f7701fa (commit)
      from  0c05eb445bc7a39a483120a2b14de233446f3a9a (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=768fbcfda81ff37027eb7a02c043ff669f7701fa

commit 768fbcfda81ff37027eb7a02c043ff669f7701fa
Author: Pedro Alves <palves@redhat.com>
Date:   Fri Jul 11 11:11:20 2014 +0100

    GDBserver crashes when killing a multi-thread process
    
    Here's an example, with the new test:
    
     gdbserver :9999 gdb.threads/kill
     gdb gdb.threads/kill
     (gdb) b 52
     Breakpoint 1 at 0x4007f4: file kill.c, line 52.
     Continuing.
    
     Breakpoint 1, main () at kill.c:52
     52        return 0; /* set break here */
     (gdb) k
     Kill the program being debugged? (y or n) y
    
     gdbserver :9999 gdb.threads/kill
     Process gdb.base/watch_thread_num created; pid = 9719
     Listening on port 1234
     Remote debugging from host 127.0.0.1
     Killing all inferiors
     Segmentation fault (core dumped)
    
    Backtrace:
    
     (gdb) bt
     #0  0x00000000004068a0 in find_inferior (list=0x66b060 <all_threads>, func=0x427637 <kill_one_lwp_callback>, arg=0x7fffffffd3fc) at src/gdb/gdbserver/inferiors.c:199
     #1  0x00000000004277b6 in linux_kill (pid=15708) at src/gdb/gdbserver/linux-low.c:966
     #2  0x000000000041354d in kill_inferior (pid=15708) at src/gdb/gdbserver/target.c:163
     #3  0x00000000004107e9 in kill_inferior_callback (entry=0x6704f0) at src/gdb/gdbserver/server.c:2934
     #4  0x0000000000406522 in for_each_inferior (list=0x66b050 <all_processes>, action=0x4107a6 <kill_inferior_callback>) at src/gdb/gdbserver/inferiors.c:57
     #5  0x0000000000412377 in process_serial_event () at src/gdb/gdbserver/server.c:3767
     #6  0x000000000041267c in handle_serial_event (err=0, client_data=0x0) at src/gdb/gdbserver/server.c:3880
     #7  0x00000000004189ff in handle_file_event (event_file_desc=4) at src/gdb/gdbserver/event-loop.c:434
     #8  0x00000000004181c6 in process_event () at src/gdb/gdbserver/event-loop.c:189
     #9  0x0000000000418f45 in start_event_loop () at src/gdb/gdbserver/event-loop.c:552
     #10 0x0000000000411272 in main (argc=3, argv=0x7fffffffd8d8) at src/gdb/gdbserver/server.c:3283
    
    The problem is that linux_wait_for_event deletes lwps that have exited
    (even those not passed in as lwps of interest), while the lwp/thread
    list is being walked on with find_inferior.  find_inferior can handle
    the current iterated inferior being deleted, but not others.
    
    When killing lwps, we don't really care about any of the pending
    status handling of linux_wait_for_event.  We can just waitpid the lwps
    directly, which is also what GDB does (see
    linux-nat.c:kill_wait_callback).  This way the lwps are not deleted
    while we're walking the list.  They'll be deleted by linux_mourn
    afterwards.
    
    This crash triggers several times when running the testsuite against
    GDBserver with the native-gdbserver board (target remote), but as GDB
    can't distinguish between GDBserver crashing and "kill" being
    sucessful, as in both cases the connection is closed (the 'k' packet
    doesn't require a reply), and the inferior is gone, that results in no
    FAIL.
    
    The patch adds a generic test that catches the issue with
    extended-remote mode (and works fine with native testing too).  Here's
    how it fails with the native-extended-gdbserver board without the fix:
    
     (gdb) info threads
       Id   Target Id         Frame
       6    Thread 15367.15374 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
       5    Thread 15367.15373 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
       4    Thread 15367.15372 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
       3    Thread 15367.15371 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
       2    Thread 15367.15370 0x000000373bcbc98d in nanosleep () at ../sysdeps/unix/syscall-template.S:81
     * 1    Thread 15367.15367 main () at .../gdb.threads/kill.c:52
     (gdb) kill
     Kill the program being debugged? (y or n) y
     Remote connection closed
     ^^^^^^^^^^^^^^^^^^^^^^^^
     (gdb) FAIL: gdb.threads/kill.exp: kill
    
    Extended remote should remain connected after the kill.
    
    gdb/gdbserver/
    2014-07-11  Pedro Alves  <palves@redhat.com>
    
    	* linux-low.c (kill_wait_lwp): New function, based on
    	kill_one_lwp_callback, but use my_waitpid directly.
    	(kill_one_lwp_callback, linux_kill): Use it.
    
    gdb/testsuite/
    2014-07-11  Pedro Alves  <palves@redhat.com>
    
    	* gdb.threads/kill.c: New file.
    	* gdb.threads/kill.exp: New file.

-----------------------------------------------------------------------

Summary of changes:
 gdb/gdbserver/ChangeLog            |    6 +++
 gdb/gdbserver/linux-low.c          |   68 +++++++++++++++++++------------
 gdb/testsuite/ChangeLog            |    5 ++
 gdb/testsuite/gdb.threads/kill.c   |   64 ++++++++++++++++++++++++++++++
 gdb/testsuite/gdb.threads/kill.exp |   77 ++++++++++++++++++++++++++++++++++++
 5 files changed, 194 insertions(+), 26 deletions(-)
 create mode 100644 gdb/testsuite/gdb.threads/kill.c
 create mode 100644 gdb/testsuite/gdb.threads/kill.exp


hooks/post-receive
-- 
gdb and binutils


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]