#ifndef _DYLD_DEBUG_
#define _DYLD_DEBUG_
#include <mach/mach.h>
#ifndef DYLD_BUILD
#include <mach-o/dyld.h>
#endif
enum dyld_debug_return {
DYLD_SUCCESS,
DYLD_INCONSISTENT_DATA,
DYLD_INVALID_ARGUMENTS,
DYLD_FAILURE
};
struct dyld_debug_module {
struct mach_header *header;
unsigned long vmaddr_slide;
unsigned long module_index;
};
enum dyld_event_type {
DYLD_IMAGE_ADDED,
DYLD_MODULE_BOUND,
DYLD_MODULE_REMOVED,
DYLD_MODULE_REPLACED,
DYLD_PAST_EVENTS_END,
DYLD_IMAGE_REMOVED
};
struct dyld_event {
enum dyld_event_type type;
struct dyld_debug_module arg[2];
};
extern enum dyld_debug_return _dyld_debug_defining_module(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
char *name,
struct dyld_debug_module *module);
extern enum dyld_debug_return _dyld_debug_is_module_bound(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
struct dyld_debug_module module,
boolean_t *bound);
extern enum dyld_debug_return _dyld_debug_bind_module(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
struct dyld_debug_module module);
extern enum dyld_debug_return _dyld_debug_module_name(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
struct dyld_debug_module module,
char **image_name,
unsigned long *image_nameCnt,
char **module_name,
unsigned long *module_nameCnt);
extern enum dyld_debug_return _dyld_debug_subscribe_to_events(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
void (*dyld_event_routine)(struct dyld_event event));
extern enum dyld_debug_return _dyld_debug_add_event_subscriber(
mach_port_t target_task,
unsigned long send_timeout,
unsigned long rcv_timeout,
boolean_t inconsistent_data_ok,
mach_port_t subscriber);
struct _dyld_event_message_request {
#ifdef __MACH30__
mach_msg_header_t head;
NDR_record_t NDR;
struct dyld_event event;
mach_msg_trailer_t trailer;
#else
msg_header_t head;
msg_type_t eventType;
struct dyld_event event;
#endif
};
struct _dyld_event_message_reply {
#ifdef __MACH30__
mach_msg_header_t head;
NDR_record_t NDR;
struct dyld_event event;
#else
msg_header_t head;
msg_type_t RetCodeType;
kern_return_t RetCode;
#endif
};
#ifndef mig_internal
extern boolean_t _dyld_event_server(
#ifdef __MACH30__
mach_msg_header_t *request,
mach_msg_header_t *reply);
#else
struct _dyld_event_message_request *request,
struct _dyld_event_message_reply *reply);
#endif
#endif
#ifndef SHLIB
extern
#ifdef __MACH30__
kern_return_t
#else
void
#endif
_dyld_event_server_callback(
#ifdef __MACH30__
mach_port_t subscriber,
#else
port_t subscriber,
#endif
struct dyld_event event);
#endif
struct _dyld_debug_task_state {
mach_port_t debug_port;
mach_port_t debug_thread;
unsigned int debug_thread_resume_count;
unsigned int task_resume_count;
mach_port_t *threads;
unsigned int thread_count;
};
extern enum dyld_debug_return _dyld_debug_make_runnable(
mach_port_t target_task,
struct _dyld_debug_task_state *state);
extern enum dyld_debug_return _dyld_debug_restore_runnable(
mach_port_t target_task,
struct _dyld_debug_task_state *state);
struct dyld_debug_error_data {
enum dyld_debug_return dyld_debug_return;
kern_return_t mach_error;
int dyld_debug_errno;
unsigned long local_error;
char *file_name;
unsigned long line_number;
};
extern void _dyld_debug_set_error_func(
void (*func)(struct dyld_debug_error_data *e));
#ifndef DYLD_BUILD
extern enum dyld_debug_return _dyld_debug_task_from_core(
NSObjectFileImage coreFileImage,
mach_port_t *core_task);
#endif
#endif