static void setExceptionThread(void) { kern_return_t r; // char *nullAddr = NULL; bailOut = FALSE; /* save the old exception port for this task */ r = task_get_exception_port(task_self(), &(ports.old_exc_port)); if (r != KERN_SUCCESS) { mach_error("task_get_exception_port",r); exit(1); } if (!ports.exc_port) { /* create a new exception port for this task */ r = port_allocate(task_self(), &(ports.exc_port)); if (r != KERN_SUCCESS) { mach_error("port_allocate",r); exit(1); } /* Fork the thread that listens to the exception port. */ cthread_detach(cthread_fork((cthread_fn_t)exc_thread,(any_t)&ports)); ports.clear_port = thread_reply(); } /* install the new exception port for this task */ r = task_set_exception_port(task_self(), (ports.exc_port)); if (r != KERN_SUCCESS) { mach_error("task_set_exception_port",r); exit(1); } }
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); }