diff options
author | Pedro Alves <pedro@palves.net> | 2022-07-05 12:21:50 +0100 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2023-11-13 14:16:10 +0000 |
commit | ad320fbf91e6808699cb69cccca7299a2332074d (patch) | |
tree | 630b06f7c936d7b14a109f56aab1df452bd99e3d /gdbserver | |
parent | 00b0dc819d1aac88ee45b18fdb05337e01a2df67 (diff) | |
download | gdb-ad320fbf91e6808699cb69cccca7299a2332074d.zip gdb-ad320fbf91e6808699cb69cccca7299a2332074d.tar.gz gdb-ad320fbf91e6808699cb69cccca7299a2332074d.tar.bz2 |
gdbserver/linux-low.cc: Ignore event_ptid if TARGET_WAITKIND_IGNORE
gdbserver's linux_process_target::wait loops if:
- called in sync mode, and,
- wait_1 returns TARGET_WAITKIND_IGNORE, _and_,
- wait_1 also returns null_ptid.
The null_ptid check fails however when this path is taken:
ptid_t
linux_process_target::filter_exit_event (lwp_info *event_child,
target_waitstatus *ourstatus)
{
...
if (!is_leader (thread))
{
if (report_exit_events_for (thread))
ourstatus->set_thread_exited (0);
else
ourstatus->set_ignore (); <<<<<<<
delete_lwp (event_child);
}
return ptid;
}
This makes linux_process_target::wait return TARGET_WAITKIND_IGNORE in
sync mode, which is unexpected by the core and fails an assertion.
This commit fixes it by just making linux_process_target::wait loop if
it got a TARGET_WAITKIND_IGNORE, irrespective of event_ptid.
Change-Id: I39776908a6c75cbd68aa04139ffcf7be334868cf
Diffstat (limited to 'gdbserver')
-rw-r--r-- | gdbserver/linux-low.cc | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 7a4f875..ca2b7aa 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -3643,7 +3643,6 @@ linux_process_target::wait (ptid_t ptid, event_ptid = wait_1 (ptid, ourstatus, target_options); } while ((target_options & TARGET_WNOHANG) == 0 - && event_ptid == null_ptid && ourstatus->kind () == TARGET_WAITKIND_IGNORE); /* If at least one stop was reported, there may be more. A single |