Re: [reverse/record] adjust_pc_after_break in reverse execution mode?

Pedro Alves
2008-10-30T21:43:58Z

On Thursday 30 October 2008 15:54:34, Michael Snyder wrote:
> Pedro, yes, but I can no longer get it to exhibit that behavior.
> Can you?
>

Sure, see below.

Head of ChangeLog:

2008-10-24 Michael Snyder <msnyder@vmware.com>

* infrun.c (handle_inferior_event): Handle dynamic symbol
resolution in reverse.

Test app:

18 volatile int global_foo = 0;
19
20 int
21 main (int argc, char **argv)
22 {
23 asm ("nop"); /* 1st insn */
24 asm ("nop"); /* 2nd insn */
25 asm ("nop"); /* 3rd insn */
26 asm ("nop"); /* 4th insn */
27 if (!global_foo)
28 goto ahead;
29 asm ("nop"); /* 5th insn */
30 asm ("nop"); /* 6th insn */
31 asm ("nop"); /* 7th insn */
32 asm ("nop"); /* 8th insn */ <<<<< bkpt here
33 ahead:
34 asm ("nop"); /* 9th insn */ <<<<< and here
35 end:
36 return 0;
37 }

Normal play:

>./gdb ./testsuite/gdb.base/decr-pc-rev
GNU gdb (GDB) 6.8.50.20080930-cvs
[...]
(gdb) start
Temporary breakpoint 1 at 0x8048382: file ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c, line 23.
Starting program: /home/pedro/gdb/reverse-20080930-branch/build32/gdb/testsuite/gdb.base/decr-pc-rev

Temporary breakpoint 1, main (argc=<value optimized out>, argv=<value optimized out>)
at ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c:23
23 asm ("nop"); /* 1st insn */
(gdb) b 32
Breakpoint 2 at 0x8048392: file ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c, line 32.
(gdb) b 34
Breakpoint 3 at 0x8048393: file ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c, line 34.
(gdb) c
Continuing.

Breakpoint 3, main (argc=<value optimized out>, argv=<value optimized out>)
at ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c:34
34 in ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c
(gdb) p $pc
$1 = (void (*)()) 0x8048393 <main+31>
(gdb)

Ok, breakpoint 3 was hit (notice the goto at line 28, it's
always executed because global_foo is always 0)

--------

Now the same, but while recording (replay exhibits the
same symptom)

>./gdb ./testsuite/gdb.base/decr-pc-rev
GNU gdb (GDB) 6.8.50.20080930-cvs
[...]
(gdb) start
Temporary breakpoint 1 at 0x8048382: file ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c, line 23.
Starting program: /home/pedro/gdb/reverse-20080930-branch/build32/gdb/testsuite/gdb.base/decr-pc-rev

Temporary breakpoint 1, main (argc=<value optimized out>, argv=<value optimized out>)
at ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c:23
23 asm ("nop"); /* 1st insn */
(gdb) record
^^^^^^
(gdb) c
Continuing.

Breakpoint 2, main (argc=<value optimized out>, argv=<value optimized out>)
at ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c:32
32 in ../../../src/gdb/testsuite/gdb.base/decr-pc-rev.c
(gdb) p $pc
$1 = (void (*)()) 0x8048392 <main+30>
(gdb)

Breakpoint 3 should've been hit, not 2. The PC points at
0x8048392, but it should point at 0x8048393.

Feels like we're going in circles. :-)

--
Pedro Alves