Don't rely on inferior_ptid in record_full_wait
The multi-target patch sets inferior_ptid to null_ptid before handling a target event, and thus before calling target_wait, in order to catch places in target_ops::wait implementations that are incorrectly relying on inferior_ptid (which could otherwise be a ptid of a different target, for example). That caught this instance in record-full.c. Fix it by saving the last resumed ptid, and then using it in record_full_wait_1, just like how the last "step" argument passed to record_full_target::resume is handled too. gdb/ChangeLog: 2020-01-10 Pedro Alves <palves@redhat.com> * record-full.c (record_full_resume_ptid): New global. (record_full_target::resume): Set it. (record_full_wait_1): Use record_full_resume_ptid instead of inferior_ptid.
This commit is contained in:
parent
873657b9e8
commit
ec506636cc
|
@ -1,3 +1,10 @@
|
|||
2020-01-10 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* record-full.c (record_full_resume_ptid): New global.
|
||||
(record_full_target::resume): Set it.
|
||||
(record_full_wait_1): Use record_full_resume_ptid instead of
|
||||
inferior_ptid.
|
||||
|
||||
2020-01-10 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdbthread.h (scoped_restore_current_thread)
|
||||
|
|
|
@ -1036,6 +1036,9 @@ record_full_base_target::async (int enable)
|
|||
beneath ()->async (enable);
|
||||
}
|
||||
|
||||
/* The PTID and STEP arguments last passed to
|
||||
record_full_target::resume. */
|
||||
static ptid_t record_full_resume_ptid = null_ptid;
|
||||
static int record_full_resume_step = 0;
|
||||
|
||||
/* True if we've been resumed, and so each record_full_wait call should
|
||||
|
@ -1064,6 +1067,7 @@ static enum exec_direction_kind record_full_execution_dir = EXEC_FORWARD;
|
|||
void
|
||||
record_full_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
|
||||
{
|
||||
record_full_resume_ptid = inferior_ptid;
|
||||
record_full_resume_step = step;
|
||||
record_full_resumed = 1;
|
||||
record_full_execution_dir = ::execution_direction;
|
||||
|
@ -1190,7 +1194,8 @@ record_full_wait_1 (struct target_ops *ops,
|
|||
/* This is not a single step. */
|
||||
ptid_t ret;
|
||||
CORE_ADDR tmp_pc;
|
||||
struct gdbarch *gdbarch = target_thread_architecture (inferior_ptid);
|
||||
struct gdbarch *gdbarch
|
||||
= target_thread_architecture (record_full_resume_ptid);
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
|
|
@ -478,6 +478,13 @@ struct target_ops
|
|||
TARGET_DEFAULT_NORETURN (noprocess ());
|
||||
virtual void commit_resume ()
|
||||
TARGET_DEFAULT_IGNORE ();
|
||||
/* See target_wait's description. Note that implementations of
|
||||
this method must not assume that inferior_ptid on entry is
|
||||
pointing at the thread or inferior that ends up reporting an
|
||||
event. The reported event could be for some other thread in
|
||||
the current inferior or even for a different process of the
|
||||
current target. inferior_ptid may also be null_ptid on
|
||||
entry. */
|
||||
virtual ptid_t wait (ptid_t, struct target_waitstatus *,
|
||||
int TARGET_DEBUG_PRINTER (target_debug_print_options))
|
||||
TARGET_DEFAULT_FUNC (default_target_wait);
|
||||
|
|
Loading…
Reference in New Issue