【问题标题】:what will tracee get SIGSTOP do while gdb attach to tracee当gdb附加到tracee时tracee会得到SIGSTOP做什么
【发布时间】:2021-11-04 07:06:26
【问题描述】:

我知道 tracee 调用 ptrace(TRACEME) 的行为。但是 TRACE_ATTACH 行为呢? 这是我的猜测:

  1. tracer 发送 SIGSTOP 给 tracee,tracee SIGSTOP-handler 函数将自己标记为 TRACED(但是如何?为什么它知道被跟踪)然后发送 SIGTRAP 给自己,SIGTRAP-handler 发送 SIGCHLD 给 tracer 然后暂停自己。 或
  2. tracer 将 SIGSTOP 发送给 tracee,tracee SIGSTOP-handler 函数将自己标记为 TRACED(也如何?)然后将 SIGCHLD 发送给 tracer 并暂停其efl。

【问题讨论】:

    标签: linux gdb signals ptrace


    【解决方案1】:

    tracee SIGSTOP-handler 函数将自己标记为 TRACED

    不,被跟踪者不需要做任何事情。 ptrace 适用于尚未安装任何信号处理程序的进程,因此 SIGSTOP 只是执行暂停进程的默认操作。

    一个进程被标记为被另一个进程跟踪是内核跟踪的东西,与向被跟踪者传递信号完全分开。相关的内核代码很可能是 ptrace 系统调用本身实现的一部分。

    (至少这是我从手册页和思考什么对设计有意义的有限理解。请注意PTRACE_SEIZE 存在,它在不停止进程的情况下附加。)

    【讨论】:

    • 据我所知,默认的内核信号处理程序有ptrace相关的代码。例如 SIGTRAP-handler 可能是这样的:int do_signal(struct pt_regs *regs, sigset_t *oldset) { ... if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { current->exit_code = signr; current->state = TASK_STOPPED; notify_parent(current, SIGCHLD); schedule(); ... } }
    • 啊哈,也许我知道,我弄错了信号处理程序,SIGTRAP 和 SIGSTOP 会像 do_signal 一样进入同一个处理程序
    • @protoss:“信号处理程序”具有特定含义:已向sigaction(2) 注册的用户空间代码供内核在传递信号时调用。但是您说的是为没有安装了信号处理程序的进程实现默认操作的内核代码。 (或者内核的信号传递代码,当被跟踪者收到信号时通知父级,无论它是采取默认操作还是有处理程序。)
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2022-07-08
    • 1970-01-01
    • 2013-10-07
    相关资源
    最近更新 更多