static void child_create_inferior (char *exec_file, char *allargs, char **env) { #ifdef HPUXHPPA fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL); #else fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL); #endif /* We are at the first instruction we care about. */ /* Pedal to the metal... */ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0); }
static void inf_ptrace_create_inferior (struct target_ops *ops, char *exec_file, char *allargs, char **env, int from_tty) { int pid; /* 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; if (! ops_already_pushed) { /* Clear possible core file with its process_stratum. */ push_target (ops); back_to = make_cleanup_unpush_target (ops); } pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL, NULL, NULL, NULL); if (! ops_already_pushed) discard_cleanups (back_to); startup_inferior (START_INFERIOR_TRAPS_EXPECTED); /* On some targets, there must be some explicit actions taken after the inferior has been started up. */ target_post_startup_inferior (pid_to_ptid (pid)); }
static void inf_ptrace_create_inferior (struct target_ops *ops, char *exec_file, char *allargs, char **env, int from_tty) { int pid; pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL, NULL, NULL); push_target (ops); /* On some targets, there must be some explicit synchronization between the parent and child processes after the debugger forks, and before the child execs the debuggee program. This call basically gives permission for the child to exec. */ target_acknowledge_created_inferior (pid); /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will be 1 or 2 depending on whether we're starting without or with a shell. */ startup_inferior (START_INFERIOR_TRAPS_EXPECTED); /* On some targets, there must be some explicit actions taken after the inferior has been started up. */ target_post_startup_inferior (pid_to_ptid (pid)); }
static void child_create_inferior (char *exec_file, char *allargs, char **env, int from_tty) { fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL); /* We are at the first instruction we care about. */ observer_notify_inferior_created (¤t_target, from_tty); /* Pedal to the metal... */ proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0); }
static void haiku_child_create_inferior (char *exec_file, char *allargs, char **env, int from_tty) { TRACE(("haiku_child_create_inferior(`%s', `%s', %p, %d)\n", exec_file, allargs, env, from_tty)); fork_inferior (exec_file, allargs, env, wait_for_debugger, haiku_init_debug_create_inferior, NULL, NULL); observer_notify_inferior_created (¤t_target, from_tty); proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0); // TODO: Anything more to do here? }
void inf_ptrace_target::create_inferior (const char *exec_file, const std::string &allargs, char **env, int from_tty) { pid_t pid; ptid_t ptid; /* 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); target_unpush_up unpusher; if (! ops_already_pushed) { /* Clear possible core file with its process_stratum. */ push_target (this); unpusher.reset (this); } pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL, NULL, NULL, NULL); ptid = ptid_t (pid); /* We have something that executes now. We'll be running through the shell at this point (if startup-with-shell is true), but the pid shouldn't change. */ add_thread_silent (ptid); unpusher.release (); gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED); /* On some targets, there must be some explicit actions taken after the inferior has been started up. */ target_post_startup_inferior (ptid); }