static void inf_ptrace_attach (struct target_ops *ops, char *args, int from_tty) { char *exec_file; pid_t pid; struct inferior *inf; /* Do not change either targets above or the same target if already present. The reason is the target stack is shared across multiple inferiors. */ int ops_already_pushed = target_is_pushed (ops); struct cleanup *back_to = NULL; pid = parse_pid_to_attach (args); if (pid == getpid ()) /* Trying to m********e? */ error (_("I refuse to debug myself!")); if (! ops_already_pushed) { /* target_pid_to_str already uses the target. Also clear possible core file with its process_stratum. */ push_target (ops); back_to = make_cleanup_unpush_target (ops); } if (from_tty) { exec_file = get_exec_file (0); if (exec_file) printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, target_pid_to_str (pid_to_ptid (pid))); else printf_unfiltered (_("Attaching to %s\n"), target_pid_to_str (pid_to_ptid (pid))); gdb_flush (gdb_stdout); } #ifdef PT_ATTACH errno = 0; ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); if (errno != 0) perror_with_name (("ptrace")); #else error (_("This system does not support attaching to a process")); #endif inf = current_inferior (); inferior_appeared (inf, pid); inf->attach_flag = 1; inferior_ptid = pid_to_ptid (pid); /* Always add a main thread. If some target extends the ptrace target, it should decorate the ptid later with more info. */ add_thread_silent (inferior_ptid); if (! ops_already_pushed) discard_cleanups (back_to); }
void inf_ptrace_target::attach (const char *args, int from_tty) { char *exec_file; pid_t pid; struct inferior *inf; /* Do not change either targets above or the same target if already present. The reason is the target stack is shared across multiple inferiors. */ int ops_already_pushed = target_is_pushed (this); pid = parse_pid_to_attach (args); if (pid == getpid ()) /* Trying to m********e? */ error (_("I refuse to debug myself!")); target_unpush_up unpusher; if (! ops_already_pushed) { /* target_pid_to_str already uses the target. Also clear possible core file with its process_stratum. */ push_target (this); unpusher.reset (this); } if (from_tty) { exec_file = get_exec_file (0); if (exec_file) printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, target_pid_to_str (ptid_t (pid))); else printf_unfiltered (_("Attaching to %s\n"), target_pid_to_str (ptid_t (pid))); gdb_flush (gdb_stdout); } #ifdef PT_ATTACH errno = 0; ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); if (errno != 0) perror_with_name (("ptrace")); #else error (_("This system does not support attaching to a process")); #endif inf = current_inferior (); inferior_appeared (inf, pid); inf->attach_flag = 1; inferior_ptid = ptid_t (pid); /* Always add a main thread. If some target extends the ptrace target, it should decorate the ptid later with more info. */ thread_info *thr = add_thread_silent (inferior_ptid); /* Don't consider the thread stopped until we've processed its initial SIGSTOP stop. */ set_executing (thr->ptid, true); unpusher.release (); }