コード例 #1
0
void next_inferior_destroy (next_inferior_status *s)
{
  next_signal_thread_destroy (&s->signal_status);
  next_exception_thread_destroy (&s->exception_status);
#if defined(WITH_CFM) && WITH_CFM
  next_cfm_thread_destroy (&s->cfm_status);
#endif /* WITH_CFM */

  s->task = TASK_NULL;
  s->pid = 0;

  next_inferior_reset (s);
}
コード例 #2
0
void next_create_inferior_for_task
(struct next_inferior_status *inferior, task_t task, int pid)
{
  kern_return_t ret;

  CHECK_FATAL (inferior != NULL);

  next_inferior_destroy (inferior);
  next_inferior_reset (inferior);

  inferior->task = task;
  inferior->pid = pid;

  inferior->attached_in_ptrace = 0;
  inferior->stopped_in_ptrace = 0;
  inferior->suspend_count = 0;

  /* */

  dyld_init_paths (&inferior->dyld_status.path_info);

  /* get notification messages for current task */

  ret = port_allocate (task_self (), &inferior->notify_port);
  MACH_CHECK_ERROR (ret);

  ret = port_set_backlog (task_self (), inferior->notify_port, PORT_BACKLOG_MAX);
  MACH_CHECK_ERROR (ret);

  if (inferior_bind_notify_port_flag) {
    ret = task_set_notify_port (task_self (), inferior->notify_port);
    MACH_CHECK_ERROR (ret);
  }

  /* initialize signal port */

  ret = port_allocate (task_self (), &inferior->signal_port);
  MACH_CHECK_ERROR (ret);

  ret = port_set_backlog (task_self (), inferior->signal_port, PORT_BACKLOG_MAX);
  MACH_CHECK_ERROR (ret);

  /* initialize dyld port */

  ret = port_allocate (task_self (), &inferior->dyld_port);
  MACH_WARN_ERROR (ret);

  ret = port_set_backlog (task_self (), inferior->dyld_port, PORT_BACKLOG_MAX);
  MACH_CHECK_ERROR (ret);

  /* initialize gdb exception port */

  ret = port_allocate (task_self (), &inferior->exception_port);
  MACH_CHECK_ERROR (ret);

  ret = port_set_backlog (task_self (), inferior->exception_port, PORT_BACKLOG_MAX);
  MACH_CHECK_ERROR (ret);

  ret = port_allocate (task_self (), &inferior->exception_reply_port);
  MACH_CHECK_ERROR (ret);

  ret = port_set_backlog (task_self (), inferior->exception_reply_port, PORT_BACKLOG_MAX);
  MACH_CHECK_ERROR (ret);

  /* commandeer inferior exception port */

  if (inferior_bind_exception_port_flag) {
    next_save_exception_ports (inferior->task, &inferior->saved_exceptions);

    ret = task_set_exception_port (task, inferior->exception_port);
    MACH_CHECK_ERROR (ret);
  }

  inferior->last_thread = next_primary_thread_of_task (inferior->task);
}