Xcode下调用host_processor_sets返回KERN_INVALID_ARGUMENT错误求解
排查解决步骤
- 首先修正主机端口权限获取逻辑:你当前使用的
mach_host_self()返回的是普通权限的主机端口,没有操作处理器集的权限,需要先调用host_get_host_priv()获取特权主机端口,直接传普通端口会触发KERN_INVALID_ARGUMENT错误。 - 校验运行权限实际生效状态:即使在Scheme中配置了root权限运行,也要在代码中打印
getuid()确认返回值为0。macOS的系统完整性保护(SIP)、应用沙盒、Hardened Runtime限制都可能导致权限配置失效,可临时关闭SIP的调试限制后重试。 - 检查Swift与C API的桥接正确性:
processor_set_name_array_t是内核自动分配的出参,不需要提前手动初始化,注意不要对Optional类型的指针做错误的内存绑定。 - 补充entitlement配置:macOS 10.15+版本运行该代码,需要在项目的Signing & Capabilities中开启Hardened Runtime,同时添加
com.apple.security.cs.debugger权限,否则即使是root用户也会触发参数错误。
注意:该API仅支持macOS平台,iOS/iPadOS系统存在沙盒限制,调用会直接返回错误
修正后的可运行代码示例
import Foundation import Mach fileprivate let machHost = mach_host_self() var hostPriv: host_priv_t = 0 // 先获取特权主机端口 let privKr = host_get_host_priv(machHost, &hostPriv) guard privKr == KERN_SUCCESS else { print("获取特权端口失败,错误码:\(privKr)") exit(-1) } var psets: processor_set_name_array_t? var pcnt: mach_msg_type_number_t = 0 let result = host_processor_sets(hostPriv, &psets, &pcnt) if result == KERN_SUCCESS { print("调用成功,处理器集数量:\(pcnt)") // 内核分配的内存需要手动释放 vm_deallocate( mach_task_self_, vm_address_t(UInt(bitPattern: psets)), vm_size_t(pcnt * MemoryLayout<processor_set_name_t>.stride) ) } else { print("调用失败,错误码:\(result)") }
内容的提问来源于stack exchange,提问作者Ramkumar Srinivasan
相关产品推荐
相关产品推荐

