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,操作步骤:
- 重启Mac,按住电源键直到进入恢复模式
- 打开终端,执行:
csrutil disable - 重启系统,SIP临时关闭
- 完成追踪后,务必重启到恢复模式执行:
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调用)
- 编写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()
- 编写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
- 适配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
相关产品推荐
相关产品推荐

