打印task的日志为(os / kern)报错,程序是以dylib形式,代码如下
extern "C" kern_return_t
mach_vm_region_recurse(
vm_map_t map,
mach_vm_address_t *address,
mach_vm_size_t *size,
uint32_t *depth,
vm_region_recurse_info_t info,
mach_msg_type_number_t *infoCnt);
pid_t get_processes_pid() {
size_t length = 0;
static const int name[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
int err = sysctl((int *)name, (sizeof(name) / sizeof(*name)) - 1, NULL, &length, NULL, 0);
if (err == -1) err = errno;
if (err == 0) {
struct kinfo_proc *procBuffer = (struct kinfo_proc *)malloc(length);
if(procBuffer == NULL) return -1;
sysctl((int *)name, (sizeof(name) / sizeof(*name)) - 1, procBuffer, &length, NULL, 0);
int count = (int)length / sizeof(struct kinfo_proc);
for (int i = 0; i < count; ++i) {
const char *procname = procBuffer[i].kp_proc.p_comm;
if (strstr(procname, processes_name.c_str())) {
pid_t pid = procBuffer[i].kp_proc.p_pid;
return pid;
}
break;
}
}
return -1;
}
vm_map_offset_t get_base_address() {
vm_map_offset_t vmoffset = 0;
vm_map_size_t vmsize = 0;
uint32_t nesting_depth = 0;
struct vm_region_submap_info_64 vbr;
mach_msg_type_number_t vbrcount = 16;
pid_t pid = get_processes_pid();
kern_return_t kret = task_for_pid(mach_task_self(), pid, &get_task);
if (kret == KERN_SUCCESS) {
NSLog(@"Connection Success. %d ------", get_task);
mach_vm_region_recurse(get_task, &vmoffset, &vmsize, &nesting_depth, (vm_region_recurse_info_t)&vbr, &vbrcount);
}
return vmoffset;
}