Swift中使用UnsafeMutablePointer处理proc_pid_rusage结果的对齐错误问题
解决proc_pid_rusage的内存对齐错误问题
错误原因分析
你遇到的load from misaligned raw pointer崩溃,核心问题是内存分配和指针传递的方式错误:
- 你分配了
UnsafeMutablePointer<rusage_info_t?>类型的内存,这是一个指向「可选原始指针」的指针,但proc_pid_rusage需要的是能容纳rusage_info_v0结构体的缓冲区指针,而非指针的指针。 - 错误的指针类型导致
proc_pid_rusage写入的数据位置不符合rusage_info_v0的内存对齐要求,后续加载结构体时触发崩溃。
修正后的代码方案
推荐使用栈上变量的方式,自动处理对齐,代码更简洁安全:
import Darwin // 获取当前进程ID let pid = getpid() // 指定flavor为RUSAGE_INFO_V0(对应数值0) let flavor = RUSAGE_INFO_V0 // 定义栈上的rusage_info_v0变量,自动保证内存对齐 var usageInfo = rusage_info_v0() // 将变量指针转换为proc_pid_rusage需要的类型并调用函数 let status = withUnsafeMutablePointer(to: &usageInfo) { ptr in proc_pid_rusage(pid, flavor, ptr.withMemoryRebound(to: UnsafeMutableRawPointer.self, capacity: 1) { $0 }) } if status == KERN_SUCCESS { print("User time: \(usageInfo.ri_user_time)") } else { print("调用失败,状态码:\(status)") }
如果你需要手动分配堆内存,也可以这样写(需手动管理内存和对齐):
import Darwin let pid = getpid() let flavor = RUSAGE_INFO_V0 // 根据rusage_info_v0的内存大小和对齐要求分配堆内存 let infoSize = MemoryLayout<rusage_info_v0>.stride let infoAlignment = MemoryLayout<rusage_info_v0>.alignment guard let infoPtr = UnsafeMutableRawPointer.allocate(byteCount: infoSize, alignment: infoAlignment) else { fatalError("内存分配失败") } // 确保内存释放 defer { infoPtr.deallocate() } // 调用proc_pid_rusage let status = proc_pid_rusage(pid, flavor, infoPtr) if status == KERN_SUCCESS { // 从对齐的指针加载结构体 let usageInfo = infoPtr.load(as: rusage_info_v0.self) print("User time: \(usageInfo.ri_user_time)") } else { print("调用失败,状态码:\(status)") }
关键说明
rusage_info_t本质是通用的原始指针类型,用于指向不同flavor对应的rusage信息结构体,并非指针的指针类型。- 分配内存时必须保证内存对齐符合目标结构体的要求,栈上变量会自动处理对齐,堆内存分配时需指定
MemoryLayout<T>.alignment作为对齐参数。
内容的提问来源于stack exchange,提问作者egor10_4
相关产品推荐
相关产品推荐

