From: Luis Machado <luis.machado@linaro.org>
To: "Maciej W. Rozycki" <macro@wdc.com>,
Pedro Alves <palves@redhat.com>,
gdb-patches@sourceware.org
Cc: Jim Wilson <jimw@sifive.com>
Subject: Re: [PATCH v2 3/4] Remove breakpoint step-over information if failed to resume
Date: Wed, 19 Feb 2020 13:30:00 -0000 [thread overview]
Message-ID: <f81b2c30-1757-53ad-152a-bf9d26818f95@linaro.org> (raw)
In-Reply-To: <alpine.LFD.2.21.1911051718280.13542@redsun52.ssa.fujisawa.hgst.com>
On 11/6/19 5:52 PM, Maciej W. Rozycki wrote:
> Complement commit 31e77af205cf ("PR breakpoints/7143 - Watchpoint does
> not trigger when first set") and commit 71d378ae60a4
> ("gdb.base/breakpoint-in-ro-region.exp regression on sss targets (PR
> gdb/22583)") and also remove breakpoint step-over information if the
> inferior has failed to resume, which may be due to for example a failure
> to insert a software breakpoint at an inaccessible location. If this
> happens, the state of GDB becomes inconsistent and further attempts to
> start execution hang.
>
> This was observed with a `riscv64-linux-gnu' cross-GDB and RISC-V/Linux
> `gdbserver' being developed and an attempt to step over the `ret' aka
> `c.jr ra' instruction where the value held in the `ra' aka `x1' register
> and therefore the address of a software-stepping breakpoint to insert is
> 0. Here's a record of a remote debug session leading to the issue:
>
> Sending packet: $vCont?#49...Packet received: vCont;c;C;t
> Packet vCont (verbose-resume) is supported
> Sending packet: $vCont;c:p23cb.-1#08...Packet received: T05swbreak:;02:20da080000000000;20:b807565515000000;thread:p23cb.23cb;core:3;
> Sending packet: $qXfer:libraries-svr4:read::0,1000#20...Packet received: l<library-list-svr4 version="1.0" main-lm="0x155556f160"><library name=".../sysroot/lib/ld-linux-riscv64-lp64d.so.1" lm="0x155556ea18" l_addr="0x1555556000" l_ld="0x155556de90"/><library name="linux-vdso.so.1" lm="0x155556f6f0" l_addr="0x1555570000" l_ld="0x1555570350"/></library-list-svr4>
> Sending packet: $X15555607b8,2:\202\200#2e...Packet received: OK
> Sending packet: $m15555607b8,2#07...Packet received: 8280
> Sending packet: $m15555607b8,2#07...Packet received: 8280
> Sending packet: $g#67...Packet received: 0000000000000000000000000000000020da08000000000000000000000000000000000000000000d0ae040000000000696e74000000000000000000000000000100000000000000020000000000000080d708000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e408000000000020e908000000000000000000000000000000000000000000d0ae04000000000072697363765f646f00000000000000000100000000000000030000000000000000e408000000000020f208000000000000000000000000000000000000000000d0ae04000000000072697363765f646f0000000000000000[552 bytes omitted]
> Sending packet: $m0,40#2d...Packet received: E01
> Sending packet: $m0,1#fa...Packet received: E01
> Sending packet: $m0,40#2d...Packet received: E01
> Sending packet: $m0,1#fa...Packet received: E01
> Cannot access memory at address 0x0
> (gdb) stepi
> Sending packet: $m15555607b8,4#09...Packet received: 82802a87
> Sending packet: $m15555607b4,4#05...Packet received: 01452dbd
> ^Cremote_pass_ctrlc called
> remote_interrupt called
> ^Cremote_pass_ctrlc called
> Interrupted while waiting for the program.
> Give up waiting? (y or n) y
> Quit
> (gdb)
>
> As observed here the `stepi' command does not even attempt to reinsert
> the breakpoint, let alone resume execution.
>
> Correct the issue by making a call to clear global breakpoint step-over
> from the exception catch clause in `resume'.
>
> With the change applied further `stepi' commands correctly retry
> breakpoint insertion:
>
> (gdb) stepi
> Sending packet: $m15555607b8,4#09...Packet received: 82802a87
> Sending packet: $m15555607b4,4#05...Packet received: 01452dbd
> Sending packet: $m15555607b8,2#07...Packet received: 8280
> Sending packet: $m15555607b8,2#07...Packet received: 8280
> Sending packet: $m0,40#2d...Packet received: E01
> Sending packet: $m0,1#fa...Packet received: E01
> Sending packet: $m0,40#2d...Packet received: E01
> Sending packet: $m0,1#fa...Packet received: E01
> Cannot access memory at address 0x0
> (gdb)
>
> and changing the value of the `pc' register so as not to point at a
> `ret' instruction allows execution to be actually resumed.
>
> gdb/
> * infrun.c (resume): Also call `clear_step_over_info' in the
> `catch' clause.
> ---
> Changes from v1:
>
> - Add a thread number argument to `clear_step_over_info'.
> ---
> gdb/infrun.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> gdb-resume-clear-step-over-info.diff
> Index: binutils-gdb/gdb/infrun.c
> ===================================================================
> --- binutils-gdb.orig/gdb/infrun.c
> +++ binutils-gdb/gdb/infrun.c
> @@ -2620,7 +2620,12 @@ resume (gdb_signal sig)
> single-step breakpoints perturbing other threads, in case
> we're running in non-stop mode. */
> if (inferior_ptid != null_ptid)
> - delete_single_step_breakpoints (inferior_thread ());
> + {
> + thread_info *tp = inferior_thread ();
> +
> + delete_single_step_breakpoints (tp);
> + clear_step_over_info (tp->global_num);
> + }
> throw;
> }
> }
>
I'd suggest the same approach of checking if the thread has step-over
information and then clearing the state without the need to add a global
thread number parameter to clear_step_over_info.
Otherwise this looks reasonable to me.
It would've been nice to have more robust rollback logic to handle such
cases of failure.
next prev parent reply other threads:[~2020-02-19 13:30 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 20:51 [PATCH v2 0/4] GDB fixes for the remote end having gone astray Maciej W. Rozycki
2019-11-06 20:51 ` [PATCH v2 1/4] Remove stale breakpoint step-over information Maciej W. Rozycki
2020-01-21 5:41 ` Simon Marchi
2020-02-19 11:26 ` Luis Machado
2019-11-06 20:52 ` [PATCH v2 3/4] Remove breakpoint step-over information if failed to resume Maciej W. Rozycki
2020-01-21 8:29 ` Simon Marchi
2020-02-19 13:30 ` Luis Machado [this message]
2019-11-06 20:52 ` [PATCH v2 4/4] Unregister the inferior from the event loop " Maciej W. Rozycki
2020-02-19 13:40 ` Luis Machado
2019-11-06 20:52 ` [PATCH v2 2/4] Unregister the last inferior from the event loop Maciej W. Rozycki
2020-01-21 5:47 ` Simon Marchi
2020-01-21 11:21 ` Maciej W. Rozycki
2020-01-21 17:34 ` Simon Marchi
2020-01-22 17:35 ` Maciej W. Rozycki
2020-01-23 1:19 ` Maciej W. Rozycki
2020-01-23 5:39 ` Maciej W. Rozycki
2020-01-23 16:59 ` Simon Marchi
2019-11-18 12:38 ` [PING][PATCH v2 0/4] GDB fixes for the remote end having gone astray Maciej W. Rozycki
2019-11-26 15:49 ` [PING^2][PATCH " Maciej W. Rozycki
2019-12-02 14:50 ` [PING^3][PATCH " Maciej W. Rozycki
2019-12-05 20:59 ` Palmer Dabbelt via gdb-patches
2019-12-05 21:21 ` Maciej W. Rozycki
2019-12-09 21:29 ` [PING^4][PATCH " Maciej W. Rozycki
2019-12-17 0:06 ` [PING^5][PATCH " Maciej W. Rozycki
2020-01-06 15:40 ` [PING^6][PATCH " Maciej W. Rozycki
2020-01-13 20:46 ` [PING^7][PATCH " Maciej W. Rozycki
2020-01-21 4:21 ` [PING^8][PATCH " Maciej W. Rozycki
2020-02-10 9:01 ` [PING^10][PATCH " Maciej W. Rozycki
2020-02-17 14:07 ` [PATCH " Maciej W. Rozycki
2020-02-18 10:38 ` Luis Machado
2020-02-19 21:11 ` Tom Tromey
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=f81b2c30-1757-53ad-152a-bf9d26818f95@linaro.org \
--to=luis.machado@linaro.org \
--cc=gdb-patches@sourceware.org \
--cc=jimw@sifive.com \
--cc=macro@wdc.com \
--cc=palves@redhat.com \
/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