forked from Imagelibrary/binutils-gdb
Fix crash in aarch64-linux gdbserver
Since commit 393a6b5947 ("Thread options & clone events (Linux
GDBserver)"), aarch64-linux gdbserver crashes when the inferior
vforks. This happens in aarch64_get_debug_reg_state:
struct process_info *proc = find_process_pid (pid);
return &proc->priv->arch_private->debug_reg_state;
Here, find_process_pid returns nullptr -- the new inferior hasn't yet
been created in linux_process_target::handle_extended_wait.
This patch fixes the problem by having
linux_process_target::handle_extended_wait create the child process
earlier, before the child LWP is created. This is what the function
did before it was reorganized by the commit referred above.
Change-Id: Ib8b3a2e6048c3ad2b91a92ea4430da507db03c50
Co-Authored-By: Tom Tromey <tromey@adacore.com>
This commit is contained in:
@@ -555,6 +555,16 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
|
|||||||
? ptid_t (new_pid, new_pid)
|
? ptid_t (new_pid, new_pid)
|
||||||
: ptid_t (ptid_of (event_thr).pid (), new_pid));
|
: ptid_t (ptid_of (event_thr).pid (), new_pid));
|
||||||
|
|
||||||
|
process_info *child_proc = nullptr;
|
||||||
|
|
||||||
|
if (event != PTRACE_EVENT_CLONE)
|
||||||
|
{
|
||||||
|
/* Add the new process to the tables before we add the LWP.
|
||||||
|
We need to do this even if the new process will be
|
||||||
|
detached. See breakpoint cloning code further below. */
|
||||||
|
child_proc = add_linux_process (new_pid, 0);
|
||||||
|
}
|
||||||
|
|
||||||
lwp_info *child_lwp = add_lwp (child_ptid);
|
lwp_info *child_lwp = add_lwp (child_ptid);
|
||||||
gdb_assert (child_lwp != NULL);
|
gdb_assert (child_lwp != NULL);
|
||||||
child_lwp->stopped = 1;
|
child_lwp->stopped = 1;
|
||||||
@@ -588,12 +598,11 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
|
|||||||
|
|
||||||
if (event != PTRACE_EVENT_CLONE)
|
if (event != PTRACE_EVENT_CLONE)
|
||||||
{
|
{
|
||||||
/* Add the new process to the tables and clone the breakpoint
|
/* Clone the breakpoint lists of the parent. We need to do
|
||||||
lists of the parent. We need to do this even if the new process
|
this even if the new process will be detached, since we
|
||||||
will be detached, since we will need the process object and the
|
will need the process object and the breakpoints to
|
||||||
breakpoints to remove any breakpoints from memory when we
|
remove any breakpoints from memory when we detach, and
|
||||||
detach, and the client side will access registers. */
|
the client side will access registers. */
|
||||||
process_info *child_proc = add_linux_process (new_pid, 0);
|
|
||||||
gdb_assert (child_proc != NULL);
|
gdb_assert (child_proc != NULL);
|
||||||
|
|
||||||
process_info *parent_proc = get_thread_process (event_thr);
|
process_info *parent_proc = get_thread_process (event_thr);
|
||||||
|
|||||||
Reference in New Issue
Block a user