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.7-branch updated. gdb-7.7-release-27-g8fd1f49


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.7-branch has been updated
       via  8fd1f4997cebf077f06a4c8c6e08cb54697a25d7 (commit)
      from  95bffc909f350e40df08c66f8d0bc96f087a1bbd (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=8fd1f4997cebf077f06a4c8c6e08cb54697a25d7

commit 8fd1f4997cebf077f06a4c8c6e08cb54697a25d7
Author: Pedro Alves <palves@redhat.com>
Date:   Wed Feb 26 16:52:24 2014 +0000

    Make sure we don't resume the stepped thread by accident.
    
    Say:
    
    <stopped at a breakpoint in thread 2>
    (gdb) thread 3
    (gdb) step
    
    The above triggers the prepare_to_proceed/deferred_step_ptid process,
    which switches back to thread 2, to step over its breakpoint before
    getting back to thread 3 and "step" it.
    
    If while stepping over the breakpoint in thread 2, a signal arrives,
    and it is set to pass/nostop, we'll set a step-resume breakpoint at
    the supposed signal-handler resume address, and call keep_going.  The
    problem is that we were supposedly stepping thread 3, and that
    keep_going delivers a signal to thread 2, and due to scheduler-locking
    off, resumes everything else, _including_ thread 3, the thread we want
    stepping.  This means that we lose control of thread 3 until the next
    event, when we stop everything.  The end result for the user, is that
    GDB lost control of the "step".
    
    Here's the current infrun debug output of the above, with the testcase
    in the patch below:
    
    infrun: clear_proceed_status_thread (Thread 0x2aaaab8f5700 (LWP 11663))
    infrun: clear_proceed_status_thread (Thread 0x2aaaab6f4700 (LWP 11662))
    infrun: clear_proceed_status_thread (Thread 0x2aaaab4f2b20 (LWP 11659))
    infrun: proceed (addr=0xffffffffffffffff, signal=144, step=1)
    infrun: prepare_to_proceed (step=1), switched to [Thread 0x2aaaab6f4700 (LWP 11662)]
    infrun: resume (step=1, signal=0), trap_expected=1, current thread [Thread 0x2aaaab6f4700 (LWP 11662)] at 0x40098f
    infrun: wait_for_inferior ()
    infrun: target_wait (-1, status) =
    infrun:   11659 [Thread 0x2aaaab6f4700 (LWP 11662)],
    infrun:   status->kind = stopped, signal = SIGUSR1
    infrun: infwait_normal_state
    infrun: TARGET_WAITKIND_STOPPED
    infrun: stop_pc = 0x40098f
    infrun: random signal 30
    
    Program received signal SIGUSR1, User defined signal 1.
    infrun: signal arrived while stepping over breakpoint
    infrun: inserting step-resume breakpoint at 0x40098f
    infrun: resume (step=0, signal=30), trap_expected=0, current thread [Thread 0x2aaaab6f4700 (LWP 11662)] at 0x40098f
    
    ^^^ this is a wildcard resume.
    
    infrun: prepare_to_wait
    infrun: target_wait (-1, status) =
    infrun:   11659 [Thread 0x2aaaab6f4700 (LWP 11662)],
    infrun:   status->kind = stopped, signal = SIGTRAP
    infrun: infwait_normal_state
    infrun: TARGET_WAITKIND_STOPPED
    infrun: stop_pc = 0x40098f
    infrun: BPSTAT_WHAT_STEP_RESUME
    infrun: resume (step=1, signal=0), trap_expected=1, current thread [Thread 0x2aaaab6f4700 (LWP 11662)] at 0x40098f
    
    ^^^ step-resume hit, meaning the handler returned, so we go back to stepping thread 3.
    
    infrun: prepare_to_wait
    infrun: target_wait (-1, status) =
    infrun:   11659 [Thread 0x2aaaab6f4700 (LWP 11662)],
    infrun:   status->kind = stopped, signal = SIGTRAP
    infrun: infwait_normal_state
    infrun: TARGET_WAITKIND_STOPPED
    
    infrun: stop_pc = 0x40088b
    infrun: switching back to stepped thread
    infrun: Switching context from Thread 0x2aaaab6f4700 (LWP 11662) to Thread 0x2aaaab8f5700 (LWP 11663)
    infrun: resume (step=1, signal=0), trap_expected=0, current thread [Thread 0x2aaaab8f5700 (LWP 11663)] at 0x400938
    infrun: prepare_to_wait
    infrun: target_wait (-1, status) =
    infrun:   11659 [Thread 0x2aaaab8f5700 (LWP 11663)],
    infrun:   status->kind = stopped, signal = SIGTRAP
    infrun: infwait_normal_state
    infrun: TARGET_WAITKIND_STOPPED
    infrun: stop_pc = 0x40093a
    infrun: keep going
    infrun: resume (step=1, signal=0), trap_expected=0, current thread [Thread 0x2aaaab8f5700 (LWP 11663)] at 0x40093a
    infrun: prepare_to_wait
    infrun: target_wait (-1, status) =
    infrun:   11659 [Thread 0x2aaaab8f5700 (LWP 11663)],
    infrun:   status->kind = stopped, signal = SIGTRAP
    infrun: infwait_normal_state
    infrun: TARGET_WAITKIND_STOPPED
    infrun: stop_pc = 0x40091e
    infrun: stepped to a different line
    infrun: stop_stepping
    [Switching to Thread 0x2aaaab8f5700 (LWP 11663)]
    69            (*myp) ++; /* set breakpoint child_two here */
    
    ^^^ we stopped at the wrong line.  We still stepped a bit because the
    test is running in a loop, and when we got back to stepping thread 3,
    it happened to be in the stepping range.  (The loop increments a
    counter, and the test makes sure it increments exactly once.  Without
    the fix, the counter increments a bunch, since the user-stepped thread
    runs free without GDB noticing.)
    
    The fix is to switch to the stepping thread before continuing for the
    step-resume breakpoint.
    
    gdb/
    2014-02-26  Pedro Alves  <palves@redhat.com>
    
    	PR breakpoints/16292
    	* infrun.c (handle_signal_stop) <signal arrives while stepping
    	over a breakpoint>: Switch back to the stepping thread.
    
    gdb/testsuite/
    2014-02-26  Pedro Alves  <pedro@codesourcery.com>
    	    Pedro Alves  <palves@redhat.com>
    
    	PR breakpoints/16292
    	* gdb.threads/signal-while-stepping-over-bp-other-thread.c: New
    	file.
    	* gdb.threads/signal-while-stepping-over-bp-other-threadexp: New
    	file.

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

Summary of changes:
 gdb/ChangeLog                                      |    6 +
 gdb/infrun.c                                       |    6 +-
 gdb/testsuite/ChangeLog                            |    9 ++
 .../signal-while-stepping-over-bp-other-thread.c   |  145 ++++++++++++++++++++
 .../signal-while-stepping-over-bp-other-thread.exp |  120 ++++++++++++++++
 5 files changed, 285 insertions(+), 1 deletions(-)
 create mode 100644 gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.c
 create mode 100644 gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.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]