【发布时间】:2015-07-13 23:08:42
【问题描述】:
是否可以从该进程中的线程 ptrace 相同的进程?我在 [1] 上发现了一个讨论,该讨论似乎暗示了一种方式(可能有效,也可能无效),因为我对 pthreads API 并不十分熟悉。有人试过这个吗?任何代码指针都会很棒。
【问题讨论】:
是否可以从该进程中的线程 ptrace 相同的进程?我在 [1] 上发现了一个讨论,该讨论似乎暗示了一种方式(可能有效,也可能无效),因为我对 pthreads API 并不十分熟悉。有人试过这个吗?任何代码指针都会很棒。
【问题讨论】:
您最强调不想为此使用 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——它唯一可以合法做的就是调用exec 或exit。 clone() 与 CLONE_VM 而不是 CLONE_VFORK 可能会像 Linus 所描述的那样工作。