【问题标题】:Self attach using ptrace?使用 ptrace 自附加?
【发布时间】:2015-07-13 23:08:42
【问题描述】:

是否可以从该进程中的线程 ptrace 相同的进程?我在 [1] 上发现了一个讨论,该讨论似乎暗示了一种方式(可能有效,也可能无效),因为我对 pthreads API 并不十分熟悉。有人试过这个吗?任何代码指针都会很棒。

[1]http://yarchive.net/comp/linux/ptrace_self_attach.html

【问题讨论】:

    标签: linux pthreads ptrace


    【解决方案1】:

    您最强调想为此使用 POSIX 线程 (pthreads)。 POSIX 线程引入了一套全新的应用程序语义,在这里根本不适用。

    第二段解释了如何正确地做到这一点:

    对于第一个问题,我找到了一种避免该问题的合理方法: 调试线程可以执行“vfork()”(或者,如果 vfork() 在 libc,做直接的“克隆(CLONE_VFORK|CLONE_MM)”的事情)有一个新的 _不同_线程组中的线程,但能够 ptrace 和 也与虚拟机“同步”,只是因为它与所有人共享 它可能要调试的其他线程

    这种机制就是 gdb(1) 和 crash(8) 等用户空间调试器的工作方式:它们使用 vfork(2) 创建紧密耦合的子进程,或者使用类似的 Linux 特定的 clone(2) 系统调用.

    事实上,除了原始的 init(1) 程序之外,每个程序都是这样运行的:当前进程派生出一个进程,然后一个进程 [通常是子进程] 然后 exec(2)' 所需的程序来覆盖其执行环境。

    【讨论】:

    • 当你说“这种机制”很常用时,你的意思是clone()没有CLONE_VM标志,对吧?因此,这与您报价中概述的方法完全不同。 Linus 的引用似乎也错误地使用了vfork()CLONE_VFORK,因为根据vfork 手册页,新线程无法ptrace——它唯一可以合法做的就是调用execexitclone()CLONE_VM 而不是 CLONE_VFORK 可能会像 Linus 所描述的那样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2012-05-10
    相关资源
    最近更新 更多