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

如何正确使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:24:02