record: set stop_pc in "record goto" command
authorMarkus Metzger <markus.t.metzger@intel.com>
Mon, 6 Jul 2015 14:36:45 +0000 (16:36 +0200)
committerMarkus Metzger <markus.t.metzger@intel.com>
Fri, 10 Jul 2015 07:19:27 +0000 (09:19 +0200)
commit485668e5b3987456b44588c1f2fd8a0723909866
tree3155af37670a2112ceb1b4d521f4afebc8684b80
parent73854cdd438dc8858290231ebcb682377d71fec2
record: set stop_pc in "record goto" command

When navigating in the recorded execution trace via "record goto", we do not
set stop_pc.  This may trigger an internal error in infrun.c when stepping
from that location.  Set it.

(gdb) rec full
(gdb) c
Continuing.

Breakpoint 1, foo (void) at foo.c:42
42             x = y
(gdb) rn
foo (void)
    at foo.c:41
41             y = x
(gdb) rec go end
Go forward to insn number 98724
    at foo.c:42
42             x = y
(gdb) n
infrun.c:2382: internal-error: resume: Assertion `sig != GDB_SIGNAL_0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n)

This happens because there's a breakpoint at PC when the "next"
is issued, so that breapoint should be immediately stepped over.
That should have been detected/done by proceed, here:

  if (addr == (CORE_ADDR) -1)
    {
      if (pc == stop_pc
  && breakpoint_here_p (aspace, pc) == ordinary_breakpoint_here
  && execution_direction != EXEC_REVERSE)
/* There is a breakpoint at the address we will resume at,
   step one instruction before inserting breakpoints so that
   we do not stop right away (and report a second hit at this
   breakpoint).

   Note, we don't do this in reverse, because we won't
   actually be executing the breakpoint insn anyway.
   We'll be (un-)executing the previous instruction.  */
tp->stepping_over_breakpoint = 1;

But since stop_pc was stale, the pc == stop_pc check failed, and left the
breakpont at PC inserted.

gdb/
* record-btrace.c (record_btrace_goto_begin, record_btrace_goto_end)
record_btrace_goto): Move call to print_stack_frame ...
(record_btrace_set_replay): ... here.  Set stop_pc.
* record-full.c (record_full_goto_entry): Set stop_pc.

testsuite/
* gdb.btrace/record_goto-step.exp: New.
gdb/ChangeLog
gdb/record-btrace.c
gdb/record-full.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.btrace/record_goto-step.exp [new file with mode: 0644]