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 master updated. e76126e8d1fc8e244fbfce03bda4a41a7b7722b1


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, master has been updated
       via  e76126e8d1fc8e244fbfce03bda4a41a7b7722b1 (commit)
      from  b9c1d481cc639a9c1f31aea164f8716a85edd89f (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=e76126e8d1fc8e244fbfce03bda4a41a7b7722b1

commit e76126e8d1fc8e244fbfce03bda4a41a7b7722b1
Author: Pedro Alves <palves@redhat.com>
Date:   Fri Jul 11 11:07:13 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]