38 #include <sys/sysctl.h> 42 #include <mach/thread_info.h> 43 #include <mach/thread_act.h> 44 #include <mach/task.h> 45 #include <mach/vm_map.h> 46 #include <mach/mach_port.h> 47 #include <mach/mach_init.h> 48 #include <mach/mach_vm.h> 50 #define CHECK_ARGS(what, args) do { \ 51 if ((NULL == args) || ((args[0] != '0') && (args[1] != 'x'))) \ 52 error(_("%s must be specified with 0x..."), what); \ 55 #define PRINT_FIELD(structure, field) \ 56 printf_unfiltered(_(#field":\t%#lx\n"), (unsigned long) (structure)->field) 58 #define PRINT_TV_FIELD(structure, field) \ 59 printf_unfiltered(_(#field":\t%u.%06u sec\n"), \ 60 (unsigned) (structure)->field.seconds, \ 61 (unsigned) (structure)->field.microseconds) 63 #define task_self mach_task_self 64 #define task_by_unix_pid task_for_pid 65 #define port_name_array_t mach_port_array_t 66 #define port_type_array_t mach_port_array_t 74 struct kinfo_proc *procInfo;
76 sysControl[0] = CTL_KERN;
77 sysControl[1] = KERN_PROC;
78 sysControl[2] = KERN_PROC_ALL;
80 sysctl (sysControl, 3, NULL, &length, NULL, 0);
81 procInfo = (
struct kinfo_proc *)
xmalloc (length);
82 sysctl (sysControl, 3, procInfo, &length, NULL, 0);
84 count = (length /
sizeof (
struct kinfo_proc));
86 for (index = 0; index < count; ++index)
94 if (KERN_SUCCESS == result)
97 procInfo[index].kp_proc.p_comm,
98 procInfo[index].kp_proc.p_pid, taskPort);
103 procInfo[index].kp_proc.p_comm,
104 procInfo[index].kp_proc.p_pid);
117 if (args == NULL || *args == 0)
126 if (strcmp (args,
"gdb") == 0)
127 return mach_task_self ();
128 task = strtoul (args, &eptr, 0);
142 struct task_basic_info basic;
143 struct task_events_info events;
144 struct task_thread_times_info thread_times;
147 kern_return_t result;
148 unsigned int info_count;
152 if (task == TASK_NULL)
156 info_count = TASK_BASIC_INFO_COUNT;
157 result = task_info (task,
159 (task_info_t) & task_info_data.basic, &info_count);
162 PRINT_FIELD (&task_info_data.basic, suspend_count);
164 PRINT_FIELD (&task_info_data.basic, resident_size);
168 info_count = TASK_EVENTS_INFO_COUNT;
169 result = task_info (task,
171 (task_info_t) & task_info_data.events, &info_count);
177 PRINT_FIELD (&task_info_data.events, reactivations);
181 PRINT_FIELD (&task_info_data.events, messages_sent);
182 PRINT_FIELD (&task_info_data.events, messages_received);
184 info_count = TASK_THREAD_TIMES_INFO_COUNT;
185 result = task_info (task,
186 TASK_THREAD_TIMES_INFO,
187 (task_info_t) & task_info_data.thread_times,
199 unsigned int name_count, type_count;
200 kern_return_t result;
205 if (task == TASK_NULL)
208 result = mach_port_names (task, &names, &name_count, &types, &type_count);
215 for (index = 0; index < name_count; ++index)
217 mach_port_t port = names[index];
221 mach_port_type_t
type;
223 mach_port_right_t right;
225 static struct type_descr descrs[] =
227 {MACH_PORT_TYPE_SEND,
"send", MACH_PORT_RIGHT_SEND},
228 {MACH_PORT_TYPE_SEND_ONCE,
"send-once", MACH_PORT_RIGHT_SEND_ONCE},
229 {MACH_PORT_TYPE_RECEIVE,
"receive", MACH_PORT_RIGHT_RECEIVE},
230 {MACH_PORT_TYPE_PORT_SET,
"port-set", MACH_PORT_RIGHT_PORT_SET},
231 {MACH_PORT_TYPE_DEAD_NAME,
"dead", MACH_PORT_RIGHT_DEAD_NAME}
235 for (j = 0; j <
sizeof(descrs) /
sizeof(*descrs); j++)
236 if (types[index] & descrs[j].
type)
238 mach_port_urefs_t ref;
242 ret = mach_port_get_refs (task, port, descrs[j].right, &ref);
243 if (ret != KERN_SUCCESS)
265 if (port ==
priv->task)
267 else if (port ==
priv->notify_port)
271 for (
int k = 0; k <
priv->exception_info.count; k++)
272 if (port ==
priv->exception_info.ports[k])
294 vm_deallocate (
task_self (), (vm_address_t) names,
295 (name_count *
sizeof (mach_port_t)));
296 vm_deallocate (
task_self (), (vm_address_t) types,
297 (type_count *
sizeof (mach_port_type_t)));
305 mach_port_status_t
status;
306 mach_msg_type_number_t len =
sizeof (
status);
308 kret = mach_port_get_attributes
309 (task, port, MACH_PORT_RECEIVE_STATUS, (mach_port_info_t)&
status, &len);
313 (
unsigned long) task);
333 sscanf (
args,
"0x%x 0x%x", &task, &port);
341 thread_array_t threads;
343 kern_return_t result;
348 if (task == TASK_NULL)
358 mach_port_deallocate (
task_self (), threads[i]);
361 vm_deallocate (
task_self (), (vm_address_t) threads,
370 struct thread_basic_info basic;
374 kern_return_t result;
375 unsigned int info_count;
378 sscanf (args,
"0x%x", &thread);
381 info_count = THREAD_BASIC_INFO_COUNT;
384 (thread_info_t) & thread_info_data.basic,
390 PRINT_FIELD (&thread_info_data.basic, system_time);
395 PRINT_FIELD (&thread_info_data.basic, suspend_count);
410 case VM_PROT_READ | VM_PROT_WRITE:
412 case VM_PROT_EXECUTE:
414 case VM_PROT_EXECUTE | VM_PROT_READ:
416 case VM_PROT_EXECUTE | VM_PROT_WRITE:
418 case VM_PROT_EXECUTE | VM_PROT_WRITE | VM_PROT_READ:
430 case VM_INHERIT_SHARE:
432 case VM_INHERIT_COPY:
434 case VM_INHERIT_NONE:
455 return _(
"true-shrd");
456 case SM_PRIVATE_ALIASED:
457 return _(
"prv-alias");
458 case SM_SHARED_ALIASED:
459 return _(
"shr-alias");
472 case VM_MEMORY_MALLOC:
474 case VM_MEMORY_MALLOC_SMALL:
475 return _(
"malloc_small");
476 case VM_MEMORY_MALLOC_LARGE:
477 return _(
"malloc_large");
478 case VM_MEMORY_MALLOC_HUGE:
479 return _(
"malloc_huge");
482 case VM_MEMORY_REALLOC:
484 case VM_MEMORY_MALLOC_TINY:
485 return _(
"malloc_tiny");
486 case VM_MEMORY_ANALYSIS_TOOL:
487 return _(
"analysis_tool");
488 case VM_MEMORY_MACH_MSG:
489 return _(
"mach_msg");
490 case VM_MEMORY_IOKIT:
492 case VM_MEMORY_STACK:
494 case VM_MEMORY_GUARD:
496 case VM_MEMORY_SHARED_PMAP:
497 return _(
"shared_pmap");
498 case VM_MEMORY_DYLIB:
500 case VM_MEMORY_APPKIT:
502 case VM_MEMORY_FOUNDATION:
503 return _(
"foundation");
513 vm_region_basic_info_data_64_t info, prev_info;
514 mach_vm_address_t prev_address;
515 mach_vm_size_t
size, prev_size;
517 mach_port_t object_name;
518 mach_msg_type_number_t count;
523 count = VM_REGION_BASIC_INFO_COUNT_64;
524 kret = mach_vm_region (task, &address, &
size, VM_REGION_BASIC_INFO_64,
525 (vm_region_info_t) &info, &count, &object_name);
526 if (kret != KERN_SUCCESS)
531 memcpy (&prev_info, &info,
sizeof (vm_region_basic_info_data_64_t));
532 prev_address = address;
541 address = prev_address + prev_size;
549 count = VM_REGION_BASIC_INFO_COUNT_64;
551 mach_vm_region (task, &address, &
size, VM_REGION_BASIC_INFO_64,
552 (vm_region_info_t) &info, &count, &object_name);
553 if (kret != KERN_SUCCESS)
560 if (address != prev_address + prev_size)
563 if ((info.protection != prev_info.protection)
564 || (info.max_protection != prev_info.max_protection)
565 || (info.inheritance != prev_info.inheritance)
566 || (info.shared != prev_info.reserved)
567 || (info.reserved != prev_info.reserved))
578 prev_info.shared ?
_(
"shrd") :
_(
"priv"),
579 prev_info.reserved ?
_(
"reserved") :
_(
"not-rsvd"));
586 prev_address = address;
588 memcpy (&prev_info, &info,
sizeof (vm_region_basic_info_data_64_t));
599 if ((max > 0) && (num_printed >= max))
610 mach_vm_address_t r_addr;
611 mach_vm_address_t r_start;
612 mach_vm_size_t r_size;
614 mach_msg_type_number_t r_info_size;
615 vm_region_submap_short_info_data_64_t r_info;
648 r_info_size = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64;
650 kret = mach_vm_region_recurse (task, &r_start, &r_size, &r_depth,
651 (vm_region_recurse_info_t) &r_info,
653 if (kret != KERN_SUCCESS)
671 r_info.is_submap ?
_(
"sm ") :
_(
"obj"));
676 uiout->
field_int (
"tag", r_info.user_tag);
682 if (r_info.is_submap)
702 if (task == TASK_NULL)
714 if (task == TASK_NULL)
736 error (
_(
"Inferior not available"));
749 for (i = 0; i < info->
count; i++)
751 exception_mask_t mask = info->
masks[i];
756 case EXCEPTION_DEFAULT:
759 case EXCEPTION_STATE:
762 case EXCEPTION_STATE_IDENTITY:
769 if (mask & EXC_MASK_BAD_ACCESS)
771 if (mask & EXC_MASK_BAD_INSTRUCTION)
773 if (mask & EXC_MASK_ARITHMETIC)
775 if (mask & EXC_MASK_EMULATION)
777 if (mask & EXC_MASK_SOFTWARE)
779 if (mask & EXC_MASK_BREAKPOINT)
781 if (mask & EXC_MASK_SYSCALL)
783 if (mask & EXC_MASK_MACH_SYSCALL)
785 if (mask & EXC_MASK_RPC_ALERT)
787 if (mask & EXC_MASK_CRASH)
805 if (strcmp (
args,
"saved") == 0)
815 else if (strcmp (
args,
"host") == 0)
818 kret = host_get_exception_ports
825 error (
_(
"Parameter is saved, host or none"));
837 kret = task_get_exception_ports
849 _(
"Get list of tasks in system."));
851 _(
"Get list of ports in a task."));
853 _(
"Get info on a specific port."));
855 _(
"Get info on a specific task."));
857 _(
"Get list of threads in a task."));
859 _(
"Get info on a specific thread."));
862 _(
"Get information on all mach region for the task."));
864 _(
"Get information on all mach sub region for the task."));
866 _(
"Get information on mach region at given address."));
869 _(
"Disp mach exceptions."));
struct gdbarch * target_gdbarch(void)
thread_state_flavor_t flavors[EXC_TYPES_COUNT]
static void info_mach_region_command(const char *exp, int from_tty)
void field_core_addr(const char *fldname, struct gdbarch *gdbarch, CORE_ADDR address)
void field_string(const char *fldname, const char *string)
gdb::unique_xmalloc_ptr< expression > expression_up
static const char * unparse_inheritance(vm_inherit_t i)
static const char * unparse_user_tag(unsigned int tag)
struct cmd_list_element * add_info(const char *name, cmd_const_cfunc_ftype *fun, const char *doc)
static void info_mach_task_command(const char *args, int from_tty)
void table_header(int width, ui_align align, const std::string &col_name, const std::string &col_hdr)
exception_mask_t masks[EXC_TYPES_COUNT]
struct value * value_ind(struct value *arg1)
static void info_mach_regions_command(const char *args, int from_tty)
exception_behavior_t behaviors[EXC_TYPES_COUNT]
void text(const char *string)
mach_port_t darwin_ex_port
mach_port_t ports[EXC_TYPES_COUNT]
void printf_filtered(const char *format,...)
#define MACH_CHECK_ERROR(ret)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
#define TYPE_IS_REFERENCE(t)
static void info_mach_exceptions_command(const char *args, int from_tty)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
struct value * evaluate_expression(struct expression *exp)
static void disp_exception(const darwin_exception_info *info)
static task_t get_task_from_args(const char *args)
static const char * unparse_protection(vm_prot_t p)
mach_port_t darwin_host_self
static void darwin_debug_regions_recurse(task_t task)
static void info_mach_port_command(const char *args, int from_tty)
void _initialize_darwin_info_commands(void)
#define port_type_array_t
#define CHECK_ARGS(what, args)
static const char * unparse_share_mode(unsigned char p)
static darwin_inferior * get_darwin_inferior(inferior *inf)
static void info_mach_threads_command(const char *args, int from_tty)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int status
#define PRINT_TV_FIELD(structure, field)
int gdbarch_addr_bit(struct gdbarch *gdbarch)
static void darwin_debug_region(task_t task, mach_vm_address_t address)
static void darwin_debug_port_info(task_t task, mach_port_t port)
void printf_unfiltered(const char *format,...)
#define port_name_array_t
mach_port_t darwin_port_set
std::unique_ptr< private_inferior > priv
static void info_mach_regions_recurse_command(const char *args, int from_tty)
void field_int(const char *fldname, int value)
static void info_mach_ports_command(const char *args, int from_tty)
static void darwin_debug_regions(task_t task, mach_vm_address_t address, int max)
static void info_mach_thread_command(const char *args, int from_tty)
int ptid_equal(const ptid_t &ptid1, const ptid_t &ptid2)
struct inferior * current_inferior(void)
expression_up parse_expression(const char *)
#define PRINT_FIELD(structure, field)
struct type * value_type(const struct value *value)
CORE_ADDR value_as_address(struct value *val)
static void info_mach_tasks_command(const char *args, int from_tty)
mach_msg_type_number_t count
void error(const char *fmt,...)