26#include <sys/ptrace.h>
27#include "gdbsupport/gdb_wait.h"
40 return string_printf (
"thread %ld of process %d", ptid.lwp (), ptid.pid ());
49 struct ptrace_thread_state pts;
53 if (
ptrace (PT_GET_THREAD_FIRST,
pid, (caddr_t)&pts,
sizeof pts) == -1)
54 perror_with_name ((
"ptrace"));
56 while (pts.pts_tid != -1)
58 ptid_t ptid = ptid_t (
pid, pts.pts_tid, 0);
68 if (
ptrace (PT_GET_THREAD_NEXT,
pid, (caddr_t)&pts,
sizeof pts) == -1)
69 perror_with_name ((
"ptrace"));
81 memset (&pe, 0,
sizeof pe);
82 pe.pe_set_event |= PTRACE_FORK;
85 perror_with_name ((
"ptrace"));
90 target_wait_flags options)
97 pid_t
pid = wptid.pid ();
98 if (
ptrace (PT_GET_PROCESS_STATE,
pid, (caddr_t)&pe,
sizeof pe) == -1)
99 perror_with_name ((
"ptrace"));
101 wptid = ptid_t (
pid, pe.pe_tid, 0);
103 switch (pe.pe_report_event)
106 ourstatus->
set_forked (ptid_t (pe.pe_other_pid));
109 pid_t fpid = waitpid (pe.pe_other_pid,
nullptr, 0);
111 perror_with_name ((
"waitpid"));
113 if (
ptrace (PT_GET_PROCESS_STATE, fpid,
114 (caddr_t)&pe,
sizeof pe) == -1)
115 perror_with_name ((
"ptrace"));
117 gdb_assert (pe.pe_report_event == PTRACE_FORK);
118 gdb_assert (pe.pe_other_pid ==
pid);
121 ourstatus->
set_forked (ptid_t (pe.pe_other_pid));
122 wptid = ptid_t (fpid, pe.pe_tid, 0);
172 perror_with_name ((
"ptrace"));
void follow_fork(inferior *inf, ptid_t, target_waitkind, bool, bool) override
int insert_fork_catchpoint(int) override
ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags) override
int remove_fork_catchpoint(int) override
std::string pid_to_str(ptid_t) override
void post_startup_inferior(ptid_t) override
void update_thread_list() override
void post_attach(int) override
void follow_fork(inferior *child_inf, ptid_t child_ptid, target_waitkind fork_kind, bool follow_child, bool detach_on_fork) override
#define ptrace(request, pid, addr, data)
struct thread_info * add_thread(process_stratum_target *targ, ptid_t ptid)
void thread_change_ptid(process_stratum_target *targ, ptid_t old_ptid, ptid_t new_ptid)
bool in_thread_list(process_stratum_target *targ, ptid_t ptid)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
struct inferior * find_inferior_pid(process_stratum_target *targ, int pid)
static void obsd_enable_proc_events(pid_t pid)
ptid_t wait(ptid_t, struct target_waitstatus *, target_wait_flags) override
target_waitstatus & set_forked(ptid_t child_ptid)
target_waitkind kind() const
std::string normal_pid_to_str(ptid_t ptid)
@ TARGET_WAITKIND_STOPPED