From: Pedro Alves Date: Thu, 1 Apr 2010 15:31:26 +0000 (+0000) Subject: * linux-low.c (get_stop_pc): Don't adjust the PC if stopped with X-Git-Tag: cygwin-1_7_4-release~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bdabb07895854f0a2109bbbe9755b8ea6d6a9611;p=thirdparty%2Fbinutils-gdb.git * linux-low.c (get_stop_pc): Don't adjust the PC if stopped with an extended waitstatus, or by a watchpoint. (cancel_breakpoints_callback): Don't cancel a breakpoint if the thread was stepping or has been stopped by a watchpoint. --- diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 21ea7c61766..59289d754f8 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,10 @@ +2010-04-01 Pedro Alves + + * linux-low.c (get_stop_pc): Don't adjust the PC if stopped with + an extended waitstatus, or by a watchpoint. + (cancel_breakpoints_callback): Don't cancel a breakpoint if the + thread was stepping or has been stopped by a watchpoint. + 2010-04-01 Pedro Alves * mem-break.c (struct raw_breakpoint): New field shlib_disabled. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 84f549cdb21..59187ee68f8 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -511,7 +511,10 @@ get_stop_pc (struct lwp_info *lwp) stop_pc = get_pc (lwp); - if (WSTOPSIG (lwp->last_status) == SIGTRAP && !lwp->stepping) + if (WSTOPSIG (lwp->last_status) == SIGTRAP + && !lwp->stepping + && !lwp->stopped_by_watchpoint + && lwp->last_status >> 16 == 0) stop_pc -= the_low_target.decr_pc_after_break; if (debug_threads) @@ -1128,15 +1131,6 @@ cancel_breakpoint (struct lwp_info *lwp) if (!supports_breakpoints ()) return 0; - if (lwp->stepping) - { - if (debug_threads) - fprintf (stderr, - "CB: [%s] is stepping\n", - target_pid_to_str (lwp->head.id)); - return 0; - } - regcache = get_thread_regcache (get_lwp_thread (lwp), 1); /* breakpoint_at reads from current inferior. */ @@ -1499,6 +1493,8 @@ cancel_breakpoints_callback (struct inferior_list_entry *entry, void *data) && lp->status_pending_p && WIFSTOPPED (lp->status_pending) && WSTOPSIG (lp->status_pending) == SIGTRAP + && !lp->stepping + && !lp->stopped_by_watchpoint && cancel_breakpoint (lp)) /* Throw away the SIGTRAP. */ lp->status_pending_p = 0;