diff options
author | Daniel Jacobowitz <dan@debian.org> | 2007-12-18 21:58:01 +0000 |
---|---|---|
committer | Daniel Jacobowitz <dan@debian.org> | 2007-12-18 21:58:01 +0000 |
commit | 6c02160f9e6c8022ab7b49e80b783133162e6f19 (patch) | |
tree | 0815f5d458c666f1b38add33855109a23efd4141 /gdb/gdbserver/mem-break.c | |
parent | 3497bde60d389f047c913275df8818c6e248ad2d (diff) | |
download | gdb-6c02160f9e6c8022ab7b49e80b783133162e6f19.tar.gz |
* linux-low.c (linux_wait_for_event): Update messages. Do not
reinsert auto-delete breakpoints.
* mem-break.c (struct breakpoint): Change return type of handler to
int.
(set_breakpoint_at): Update handler type.
(reinsert_breakpoint_handler): Return 1 instead of calling
delete_breakpoint.
(reinsert_breakpoint_by_bp): Check for the original breakpoint before
setting a new one.
(check_breakpoints): Delete auto-delete breakpoints and return 2.
* mem-break.h (set_breakpoint_at): Update handler type.
* thread-db.c (thread_db_create_event, thread_db_create_event): Update.
* win32-low.c (auto_delete_breakpoint): New.
(get_child_debug_event): Use it.
Diffstat (limited to 'gdb/gdbserver/mem-break.c')
-rw-r--r-- | gdb/gdbserver/mem-break.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/gdb/gdbserver/mem-break.c b/gdb/gdbserver/mem-break.c index 5cdb3d9ce66..f32d5a66fb4 100644 --- a/gdb/gdbserver/mem-break.c +++ b/gdb/gdbserver/mem-break.c @@ -39,14 +39,16 @@ struct breakpoint in the *next chain somewhere). */ struct breakpoint *breakpoint_to_reinsert; - /* Function to call when we hit this breakpoint. */ - void (*handler) (CORE_ADDR); + /* Function to call when we hit this breakpoint. If it returns 1, + the breakpoint will be deleted; 0, it will be reinserted for + another round. */ + int (*handler) (CORE_ADDR); }; struct breakpoint *breakpoints; void -set_breakpoint_at (CORE_ADDR where, void (*handler) (CORE_ADDR)) +set_breakpoint_at (CORE_ADDR where, int (*handler) (CORE_ADDR)) { struct breakpoint *bp; @@ -119,7 +121,7 @@ delete_breakpoint_at (CORE_ADDR addr) delete_breakpoint (bp); } -static void +static int reinsert_breakpoint_handler (CORE_ADDR stop_pc) { struct breakpoint *stop_bp, *orig_bp; @@ -135,7 +137,7 @@ reinsert_breakpoint_handler (CORE_ADDR stop_pc) (*the_target->write_memory) (orig_bp->pc, breakpoint_data, breakpoint_len); orig_bp->reinserting = 0; - delete_breakpoint (stop_bp); + return 1; } void @@ -143,12 +145,12 @@ reinsert_breakpoint_by_bp (CORE_ADDR stop_pc, CORE_ADDR stop_at) { struct breakpoint *bp, *orig_bp; - set_breakpoint_at (stop_at, reinsert_breakpoint_handler); - orig_bp = find_breakpoint_at (stop_pc); if (orig_bp == NULL) error ("Could not find original breakpoint in list."); + set_breakpoint_at (stop_at, reinsert_breakpoint_handler); + bp = find_breakpoint_at (stop_at); if (bp == NULL) error ("Could not find breakpoint in list (reinserting by breakpoint)."); @@ -203,8 +205,13 @@ check_breakpoints (CORE_ADDR stop_pc) return 0; } - (*bp->handler) (bp->pc); - return 1; + if ((*bp->handler) (bp->pc)) + { + delete_breakpoint (bp); + return 2; + } + else + return 1; } void |