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

M1 Mac下替代Linux strace命令及Python代码适配求助

适配Linux strace命令到M1 Mac环境并追踪coqc的execve调用

核心问题:系统完整性保护(SIP)限制

M1 Mac的SIP会阻止dtruss、brew版strace、execsnoop这类依赖ptrace/DTrace的工具追踪进程,这是你尝试这些工具失败的根本原因。下面提供两种可行路径:


路径1:临时关闭SIP(快速解决,谨慎操作)

关闭SIP后,你可以直接使用dtruss或brew版strace,操作步骤:

  1. 重启Mac,按住电源键直到进入恢复模式
  2. 打开终端,执行:csrutil disable
  3. 重启系统,SIP临时关闭
  4. 完成追踪后,务必重启到恢复模式执行:csrutil enable重新开启SIP(保障系统安全)

适配原strace命令

用brew版strace(参数几乎和Linux一致)

先确保已安装:brew install strace
然后直接运行适配后的命令(和原Linux命令几乎无差异):

strace -e trace=execve -v -s 100000000 -xx -ttt -ff -o output.txt sh -c 'echo hi'

用dtruss(Mac原生追踪工具)

对应原命令的dtruss版本:

sudo dtruss -t execve -v -s 100000000 -x -T -f -o output.txt sh -c 'echo hi'

参数对应说明:

  • -t execve → 对应Linux strace的-e trace=execve
  • -v → 保持 verbose 输出
  • -s 100000000 → 调整输出字符串最大长度
  • -x → 输出十六进制非ASCII字符(对应-xx)
  • -T → 输出高精度时间戳(对应-ttt)
  • -f → 追踪子进程(对应-ff,dtruss会将子进程日志写入同一文件,可后续拆分)

路径2:不关闭SIP,用LLDB追踪execve

LLDB不受SIP限制(可追踪用户启动的进程),适合不想关闭SIP的场景,可通过自动化脚本实现批量追踪。

手动调试示例(单次验证)

lldb -- sh -c 'echo hi'

在LLDB交互界面执行:

# 设置execve断点
breakpoint set -n execve
# 启动进程
run
# 触发断点后,读取execve参数(ARM64架构)
memory read --string $x0  # 读取pathname参数
memory read --string $x1  # 读取argv数组指针

自动化脚本(适配Python调用)

  1. 编写LLDB Python脚本trace_execve.py,用于捕获execve参数并写入文件:
import lldb

def on_execve_break(frame, bp_loc, _):
    # ARM64架构下,execve参数依次存于x0(pathname)、x1(argv)、x2(envp)
    pathname = frame.thread.process.ReadCStringFromMemory(frame.registers['x0'].value, 1024, lldb.SBError())
    argv_ptr = frame.registers['x1'].value
    
    # 遍历argv数组
    argv = []
    idx = 0
    while True:
        arg_ptr = frame.thread.process.ReadPointerFromMemory(argv_ptr + idx*8, lldb.SBError())
        if arg_ptr == 0:
            break
        arg_str = frame.thread.process.ReadCStringFromMemory(arg_ptr, 1024, lldb.SBError())
        argv.append(arg_str)
        idx += 1
    
    # 写入日志文件(可替换为传入的output_file路径)
    with open("coqc_execve_trace.txt", "a") as f:
        f.write(f"[+] execve called: path={pathname}, argv={argv}\n")
    
    # 继续执行进程
    frame.thread.process.Continue()
  1. 编写LLDB启动脚本trace_execve.lldb:
command script import trace_execve.py
breakpoint set -n execve
breakpoint command add -F trace_execve.on_execve_break
run
quit
  1. 适配Python的strace_build函数:
def strace_build(cmd, output_file):
    # 预先准备好LLDB脚本文件,这里假设脚本和Python代码同目录
    # 可修改trace_execve.py中的日志路径为传入的output_file
    return [
        "lldb",
        "--script", "trace_execve.lldb",
        "--",
    ] + cmd

调用时,只需将coqc命令传入cmd参数,即可自动捕获其执行时的execve参数。


适配coqc追踪的注意事项

  • 如果使用路径1(关闭SIP),直接将示例中的sh -c 'echo hi'替换为你的coqc命令即可
  • 如果使用路径2,确保coqc是当前用户启动的进程(LLDB无法追踪系统级受保护进程)

内容的提问来源于stack exchange,提问作者Charlie Parker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:11:05