inf_ptrace_target::~inf_ptrace_target ()
{}
-#ifdef PT_GET_PROCESS_STATE
-
-/* Target hook for follow_fork. On entry and at return inferior_ptid is
- the ptid of the followed inferior. */
-
-bool
-inf_ptrace_target::follow_fork (bool follow_child, bool detach_fork)
-{
- if (!follow_child)
- {
- struct thread_info *tp = inferior_thread ();
- pid_t child_pid = tp->pending_follow.value.related_pid.pid ();
-
- /* Breakpoints have already been detached from the child by
- infrun.c. */
-
- if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
- perror_with_name (("ptrace"));
- }
-
- return false;
-}
-
-int
-inf_ptrace_target::insert_fork_catchpoint (int pid)
-{
- return 0;
-}
-
-int
-inf_ptrace_target::remove_fork_catchpoint (int pid)
-{
- return 0;
-}
-
-#endif /* PT_GET_PROCESS_STATE */
\f
/* Prepare to be traced. */
target_post_startup_inferior (ptid);
}
-#ifdef PT_GET_PROCESS_STATE
-
-void
-inf_ptrace_target::post_startup_inferior (ptid_t pid)
-{
- ptrace_event_t pe;
-
- /* Set the initial event mask. */
- memset (&pe, 0, sizeof pe);
- pe.pe_set_event |= PTRACE_FORK;
- if (ptrace (PT_SET_EVENT_MASK, pid.pid (),
- (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
- perror_with_name (("ptrace"));
-}
-
-#endif
-
/* Clean up a rotting corpse of an inferior after it died. */
void
unpusher.release ();
}
-#ifdef PT_GET_PROCESS_STATE
-
-void
-inf_ptrace_target::post_attach (int pid)
-{
- ptrace_event_t pe;
-
- /* Set the initial event mask. */
- memset (&pe, 0, sizeof pe);
- pe.pe_set_event |= PTRACE_FORK;
- if (ptrace (PT_SET_EVENT_MASK, pid,
- (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
- perror_with_name (("ptrace"));
-}
-
-#endif
-
/* Detach from the inferior. If FROM_TTY is non-zero, be chatty about it. */
void
}
while (pid == -1);
-#ifdef PT_GET_PROCESS_STATE
- if (WIFSTOPPED (status))
- {
- ptrace_state_t pe;
- pid_t fpid;
-
- if (ptrace (PT_GET_PROCESS_STATE, pid,
- (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
- perror_with_name (("ptrace"));
-
- switch (pe.pe_report_event)
- {
- case PTRACE_FORK:
- ourstatus->kind = TARGET_WAITKIND_FORKED;
- ourstatus->value.related_pid = ptid_t (pe.pe_other_pid);
-
- /* Make sure the other end of the fork is stopped too. */
- fpid = waitpid (pe.pe_other_pid, &status, 0);
- if (fpid == -1)
- perror_with_name (("waitpid"));
-
- if (ptrace (PT_GET_PROCESS_STATE, fpid,
- (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
- perror_with_name (("ptrace"));
-
- gdb_assert (pe.pe_report_event == PTRACE_FORK);
- gdb_assert (pe.pe_other_pid == pid);
- if (fpid == inferior_ptid.pid ())
- {
- ourstatus->value.related_pid = ptid_t (pe.pe_other_pid);
- return ptid_t (fpid);
- }
-
- return ptid_t (pid);
- }
- }
-#endif
-
store_waitstatus (ourstatus, status);
return ptid_t (pid);
}