From 9a943f6ec34b032f95a14a0ac8f1d8304933885e Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Sun, 22 Jun 2008 20:42:49 +0000 Subject: [PATCH] 2008-06-21 Michael Snyder Fix stepping/breakpoint off-by-one issues. * gdbfreeplay-back.c (freeplay_find_event): Fix off-by-one error on last_cached_frame. (freeplay_show_next_commands): Ditto. (handle_special_case): Ditto, plus don't pass breakpoint_p == TRUE to target_compose_T_packet if we're stopped at the end of the event cache. --- gdb/gdbserver/ChangeLog | 8 ++++++++ gdb/gdbserver/gdbfreeplay-back.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 672171e0b41..d04cb3caf93 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,13 @@ 2008-06-21 Michael Snyder + Fix stepping/breakpoint off-by-one issues. + * gdbfreeplay-back.c (freeplay_find_event): Fix off-by-one error + on last_cached_frame. + (freeplay_show_next_commands): Ditto. + (handle_special_case): Ditto, plus don't pass breakpoint_p == TRUE + to target_compose_T_packet if we're stopped at the end of the + event cache. + * gdbfreeplay-back.c (handle_special_case): Silence gcc warning. * gdbfreeplay-i386.c (target_compose_g_packet): Ditto. diff --git a/gdb/gdbserver/gdbfreeplay-back.c b/gdb/gdbserver/gdbfreeplay-back.c index cf9d409c0ae..d3aa0f59895 100644 --- a/gdb/gdbserver/gdbfreeplay-back.c +++ b/gdb/gdbserver/gdbfreeplay-back.c @@ -573,7 +573,7 @@ freeplay_find_event (FILE *infile, /* Here's a strange loop for you: goes forward or backward. */ for (i = start; - i >= 0 && i < last_cached_frame; + i >= 0 && i <= last_cached_frame; direction == DIR_FORWARD ? i++ : i--) { signum = stopframe_signal (infile, i); @@ -648,12 +648,12 @@ freeplay_show_next_commands (FILE *infile) { char *line; - if (cur_frame >= 0 && cur_frame < last_cached_frame) + if (cur_frame >= 0 && cur_frame <= last_cached_frame) { fseek (infile, stopframe[cur_frame].eventpos, SEEK_SET); while ((line = fgets (inbuf, sizeof (inbuf), infile)) != NULL) { - if (cur_frame + 1 < last_cached_frame && + if (cur_frame + 1 <= last_cached_frame && ftell (infile) >= stopframe[cur_frame + 1].eventpos) /* Done with current frame. */ break; @@ -800,7 +800,7 @@ handle_special_case (FILE *infile, int fd, char *request) } else { - cur_frame = last_cached_frame - 1; + cur_frame = last_cached_frame; } /* Find the original event message for this stop event. */ @@ -811,6 +811,8 @@ handle_special_case (FILE *infile, int fd, char *request) if ((p = strstr (inbuf, "$T")) != NULL) return add_checksum (target_compose_T_packet (p, stopframe[cur_frame].pc, + next_event_frame == -1 ? + 0 : 1 /* breakpoint_p */)); /* If it's a "$S", just return it (FIXME?) */ else @@ -849,6 +851,8 @@ handle_special_case (FILE *infile, int fd, char *request) if ((p = strstr (inbuf, "$T")) != NULL) return add_checksum (target_compose_T_packet (p, stopframe[cur_frame].pc, + next_event_frame == -1 ? + 0 : 1 /* breakpoint_p */)); /* If it's a "$S", just return it (FIXME?) */ else -- 2.39.5