You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:38