如何正确使用PTRACE_INTERRUPT?调用后目标进程未中断怎么办
问题根因与解决方案
核心问题点
- 追踪进程提前退出导致ptrace自动脱离
ptrace的追踪关系和追踪者进程生命周期强绑定,你的代码发送完PTRACE_INTERRUPT请求后直接退出,内核会自动解除目标进程的ptrace附加状态,目标进程立刻恢复运行,无法观测到挂起效果。 - 未等待中断请求生效
PTRACE_INTERRUPT是异步请求,发送后需要调用waitpid()等待目标进程进入停止状态确认中断生效,你没有等待逻辑直接退出,相当于请求还未处理完成就释放了追踪关系。 - 错误的报错提示
PTRACE_INTERRUPT调用失败后的perror输出字符串误写为"PTRACE_CONT",会误导错误排查。 - 潜在权限限制
多数发行版默认开启ptrace_scope限制,仅允许进程追踪自己的子进程,附加其他进程需要root权限,否则PTRACE_SEIZE会调用失败。
修正后的测试代码
#include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("用法: %s <目标进程PID>\n", argv[0]); return 1; } pid_t pid = atoi(argv[1]); int wstatus; if (ptrace(PTRACE_SEIZE, pid, NULL, NULL) == -1) { perror("PTRACE_SEIZE失败"); return 1; } if (ptrace(PTRACE_INTERRUPT, pid, NULL, NULL) == -1) { perror("PTRACE_INTERRUPT失败"); return 1; } // 等待目标进程响应中断进入停止状态 waitpid(pid, &wstatus, 0); if (WIFSTOPPED(wstatus)) { printf("目标进程已挂起,按回车键恢复进程并退出\n"); getchar(); // 恢复目标进程运行 ptrace(PTRACE_CONT, pid, NULL, NULL); } return 0; }
使用说明
编译完成后,附加非子进程时需使用root权限运行:sudo ./程序名 目标PID。运行后目标进程会进入停止状态,可通过ps命令查看进程状态为T,按下回车键后程序会恢复目标进程运行再退出。
内容的提问来源于stack exchange,提问作者mark25789
相关产品推荐
相关产品推荐

