From c39ebbf43faa932a6860fd9c3607503641659898 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 22 Apr 2021 17:01:00 +0200 Subject: [PATCH] [gdb] Fix assert in remote_async_get_pending_events_handler Occassionally I run into the following assert: ... (gdb) PASS: gdb.multi/multi-target-continue.exp: inferior 5 Remote debugging from host ::1, port 49990^M Process multi-target-continue created; pid = 31241^M src/gdb/remote-notif.c:113: internal-error: \ void remote_async_get_pending_events_handler(gdb_client_data): \ Assertion `target_is_non_stop_p ()' failed.^M ... The assert checks target_is_non_stop_p, which is related to the current target. Fix this by changing the assert such that it checks non-stopness related to the event it's handling. Tested on x86_64-linux. gdb/ChangeLog: 2021-04-22 Simon Marchi Tom de Vries PR remote/27710 * remote.c (remote_target_is_non_stop_p): New function. * remote.h (remote_target_is_non_stop_p): Declare. * remote-notif.c (remote_async_get_pending_events_handler): Fix assert to check non-stopness using notif_state->remote rather current target. --- gdb/ChangeLog | 9 +++++++++ gdb/remote-notif.c | 2 +- gdb/remote.c | 11 +++++++++++ gdb/remote.h | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 09928110954..953fe19753f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2021-04-22 Simon Marchi + Tom de Vries + + PR remote/27710 + * remote.c (remote_target_is_non_stop_p): New function. + * remote.h (remote_target_is_non_stop_p): Declare. + * remote-notif.c (remote_async_get_pending_events_handler): Fix assert + to check non-stopness using notif_state->remote rather current target. + 2021-04-22 Tom Tromey * rust-parse.c (rust_parser::parse_sizeof): Remove KW_MUT code. diff --git a/gdb/remote-notif.c b/gdb/remote-notif.c index 5a3e1395b76..4245015ae37 100644 --- a/gdb/remote-notif.c +++ b/gdb/remote-notif.c @@ -110,7 +110,7 @@ remote_async_get_pending_events_handler (gdb_client_data data) { remote_notif_state *notif_state = (remote_notif_state *) data; clear_async_event_handler (notif_state->get_pending_events_token); - gdb_assert (target_is_non_stop_p ()); + gdb_assert (remote_target_is_non_stop_p (notif_state->remote)); remote_notif_process (notif_state, NULL); } diff --git a/gdb/remote.c b/gdb/remote.c index 7429e1a86b3..2e365df9bba 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -14730,6 +14730,17 @@ remote_target::store_memtags (CORE_ADDR address, size_t len, return packet_check_result (rs->buf.data ()) == PACKET_OK; } +/* Return true if remote target T is non-stop. */ + +bool +remote_target_is_non_stop_p (remote_target *t) +{ + scoped_restore_current_thread restore_thread; + switch_to_target_no_thread (t); + + return target_is_non_stop_p (); +} + #if GDB_SELF_TEST namespace selftests { diff --git a/gdb/remote.h b/gdb/remote.h index 18352ddb866..46bfa01fc79 100644 --- a/gdb/remote.h +++ b/gdb/remote.h @@ -77,4 +77,5 @@ extern int remote_register_number_and_offset (struct gdbarch *gdbarch, extern void remote_notif_get_pending_events (remote_target *remote, struct notif_client *np); +extern bool remote_target_is_non_stop_p (remote_target *t); #endif -- 2.30.2