From bdabb07895854f0a2109bbbe9755b8ea6d6a9611 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 1 Apr 2010 15:31:26 +0000 Subject: [PATCH] * 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. --- gdb/gdbserver/ChangeLog | 7 +++++++ gdb/gdbserver/linux-low.c | 16 ++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 21ea7c6176..59289d754f 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 84f549cdb2..59187ee68f 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; -- 2.34.1