public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Bruno Larsen <blarsen@redhat.com>
To: Pedro Alves <pedro@palves.net>, gdb-patches@sourceware.org
Subject: Re: [PATCH] gdb/reverse: Fix stepping over recursive functions
Date: Fri, 22 Jul 2022 12:31:56 -0300	[thread overview]
Message-ID: <b7b53655-74d7-88cb-6838-39b8e4d0aa8e@redhat.com> (raw)
In-Reply-To: <4883e160-bb4a-6578-1bfd-308646144aef@palves.net>


On 7/7/22 15:48, Pedro Alves wrote:
> I also don't understand why do we need all these different frame checks as above.  Breakpoints
> can have a frame associated, so that when a breakpoint hits, the breakpoint.c stuff checks
> whether the hit happened in the right frame, and if not, the breakpoint is ignored / set to
> be auto-stepped-over, and BPSTAT_WHAT_STEP_RESUME isn't reached.
> 
> The actual problem seems to me that we create the step-resume breakpoint in
> question without giving it a frame.  If I do that instead of your fix, like so:
> 
> diff --git c/gdb/infrun.c w/gdb/infrun.c
> index 02c98b50c8c..1360b8da70e 100644
> --- c/gdb/infrun.c
> +++ w/gdb/infrun.c
> @@ -7118,8 +7118,8 @@ process_event_stop_test (struct execution_control_state *ecs)
>                    symtab_and_line sr_sal;
>                    sr_sal.pc = ecs->stop_func_start;
>                    sr_sal.pspace = get_frame_program_space (frame);
> -                 insert_step_resume_breakpoint_at_sal (gdbarch,
> -                                                       sr_sal, null_frame_id);
> +                 insert_step_resume_breakpoint_at_sal
> +                   (gdbarch, sr_sal, get_stack_frame_id (frame));
>                  }
>              }
>            else
> 
> and then run your updated testcase, it passes.  I also see no regressions in gdb.reverse/ tests.
> 
> WDYT?  Are you seeing something that would break with this approach?

Hi Pedro

I have spent a while attempting to use your suggestion, but I did find something that breaks with this patch.
gdb.reverse/solib-precsave.exp shows 10 new failures. Here's a snippet before your change:

record restore /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.reverse/solib-precsave/solib.precsave
Warning: 'record restore', an alias for the command 'record full restore', is deprecated.
Use 'record full restore'.
[New LWP 22073]
Core was generated by `/home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.rever'.
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
#0  main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:27
27        char* cptr = "String 1";
Restored records from core file /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.reverse/solib-precsave/solib.precsave.
#0  main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:27
27        char* cptr = "String 1";
(gdb) PASS: gdb.reverse/solib-precsave.exp: reload core file
until 46
main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:46
46        return 0;                     /* end part one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: run until end part one
reverse-step
44        shr1 ("message 3\n");         /* shr1 three */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step third shr1
reverse-step
43        shr1 ("message 2\n");         /* shr1 two */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step second shr1
reverse-step
42        shr1 ("message 1\n");         /* shr1 one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step first shr1
reverse-step
40        b[0] = 6;   b[1] = 9;         /* generic statement, end part two */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step generic
until 46
main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:46
46        return 0;                     /* end part one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: forward to end part one
reverse-next
44        shr1 ("message 3\n");         /* shr1 three */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-next third shr1


and after your change:

record restore /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.reverse/solib-precsave/solib.precsave
Warning: 'record restore', an alias for the command 'record full restore', is deprecated.
Use 'record full restore'.
[New LWP 21721]
Core was generated by `/home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.rever'.
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
#0  main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:27
27        char* cptr = "String 1";
Restored records from core file /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/outputs/gdb.reverse/solib-precsave/solib.precsave.
#0  main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:27
27        char* cptr = "String 1";
(gdb) PASS: gdb.reverse/solib-precsave.exp: reload core file
until 46
main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:46
46        return 0;                     /* end part one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: run until end part one
reverse-step
44        shr1 ("message 3\n");         /* shr1 three */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step third shr1
reverse-step
43        shr1 ("message 2\n");         /* shr1 two */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step second shr1
reverse-step
42        shr1 ("message 1\n");         /* shr1 one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step first shr1
reverse-step
40        b[0] = 6;   b[1] = 9;         /* generic statement, end part two */
(gdb) PASS: gdb.reverse/solib-precsave.exp: reverse-step generic
until 46
main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:46
46        return 0;                     /* end part one */
(gdb) PASS: gdb.reverse/solib-precsave.exp: forward to end part one
reverse-next

No more reverse-execution history.
main () at /home/blarsen/git-pool/git-repos/gdb-local-build/gdb/testsuite/../../../binutils-gdb/gdb/testsuite/gdb.reverse/solib-reverse.c:27
27        char* cptr = "String 1";
(gdb) FAIL: gdb.reverse/solib-precsave.exp: reverse-next third shr1

And a few more reverse-next fails after this. I haven't made much progress in debugging this issue because it seems that the whole record restore
has somewhat bit-rotted, as trying to restore a recording from another GDB session results in internal errors, so I wonder if this test is still
relevant, or if we can add these failures as "FIXME" since the whole feature is having issues. DO you have any thoughts on this?

Cheers!
Bruno Larsen


  parent reply	other threads:[~2022-07-22 15:32 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-25 18:02 Bruno Larsen
2022-06-08 11:17 ` [PING] " Bruno Larsen
2022-06-15 19:21   ` [PINGv2] " Bruno Larsen
2022-06-22 18:49     ` [PINGv3] " Bruno Larsen
2022-06-29 18:46       ` [PINGv4] " Bruno Larsen
2022-07-06 11:47         ` [PINGv5] " Bruno Larsen
2022-07-07 18:48 ` Pedro Alves
2022-07-08 17:16   ` Bruno Larsen
2022-07-22 15:31   ` Bruno Larsen [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-05-23 13:46 Bruno Larsen
2022-05-23 20:03 ` Bruno Larsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b7b53655-74d7-88cb-6838-39b8e4d0aa8e@redhat.com \
    --to=blarsen@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@palves.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).