在OSX上编译ptrace()相关C程序报错,求使用及编译解决方法
在MacOS上使用ptrace()的正确姿势
嘿,我之前在MacOS上折腾ptrace的时候也碰到过不少编译和运行的坑,给你整理一下关键要点,应该能帮你解决问题:
1. 注意MacOS与Linux的ptrace差异
MacOS的ptrace接口和Linux的完全不一样,别直接照搬Linux的代码!
- 必须包含头文件
<sys/ptrace.h> - 命令宏的前缀是
PT_而不是Linux的PTRACE_,比如附加进程用PT_ATTACH,而不是PTRACE_ATTACH - 参数顺序和返回值处理也有区别
给你一个最简单的attach示例代码:
#include <sys/ptrace.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s <pid>\n", argv[0]); return 1; } pid_t pid = atoi(argv[1]); // 附加到目标进程 if (ptrace(PT_ATTACH, pid, NULL, 0) == -1) { perror("ptrace attach failed"); return 1; } // 等待进程进入停止状态 waitpid(pid, NULL, 0); printf("Attached to pid %d successfully\n", pid); // 解除附加 ptrace(PT_DETACH, pid, NULL, 0); return 0; }
2. 解决权限问题(最容易踩的坑)
MacOS的系统完整性保护(SIP)会严格限制ptrace的使用,直接运行编译后的程序大概率会报权限错误,有两种解决方式:
方式一:给程序签名(推荐,不影响系统安全)
创建一个entitlements.plist文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.debugger</key> <true/> </dict> </plist>
然后用codesign给程序签名:
codesign -s - -f --entitlements entitlements.plist your_program_name
方式二:临时关闭SIP(不推荐,会降低系统安全性)
重启Mac,按住Command+R进入恢复模式,打开终端执行:
csrutil disable
重启后生效,用完记得重新开启:csrutil enable
3. 编译命令
直接用gcc或者cc编译即可,比如:
cc -o ptrace_demo ptrace_demo.c
如果编译时报未定义符号,检查是不是头文件没包含,或者误写了Linux的ptrace宏(比如写成了PTRACE_ATTACH)。
4. 常见报错排查
error: use of undeclared identifier 'PT_ATTACH':确认已经包含<sys/ptrace.h>,不要混用Linux的宏定义ptrace attach failed: Operation not permitted:权限问题,按照上面的签名或关闭SIP的方法解决waitpid: No child processes:目标进程不存在,或者你没有权限访问该进程
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

