如果一个且只有一个线程被停止,是否可以从多线程进程中读取/写入数据?

时间:2014-03-13 12:20:43

标签: c++ c linux multithreading ptrace

ptrace上的documentation对我来说有点模糊。 它说:

  

首先需要将tracee附加到跟踪器上。附件和   后续命令是每个线程:在多线程进程中,每个   线程可以单独附加到(可能不同)   跟踪器,或者没有附加,因此没有调试。因此,   " tracee"总是意味着"(一)线程",永远" a(可能   多线程)流程"。

此外:

  

在以下请求中,pid指定tracee的线程ID   被采取行动。对于PTRACE_ATTACH,PTRACE_SEIZE以外的请求,   PTRACE_INTERRUPT和PTRACE_KILL,必须停止跟踪。

因此,如果我们有一个多线程进程并使用PTRACE_SEIZE连接到单个线程并使用PTRACE_INTERRUPT将其停止,我们是否能够使用PTRACE_PEEKTEXT,PTRACE_PEEKDATA,PTRACE_POKETEXT或PTRACE_POKEDATA读取/写入整个进程的全局数据?

次要问题: 如果主要问题的答案是肯定的,为什么需要停止一个线程呢?我认为需要停止来实现某种锁定机制,但如果单个线程被停止,那么其他线程可以写入ptrace试图自由读/写的内存。

1 个答案:

答案 0 :(得分:0)

是的,您可以读取全局内存,但如果正在运行的线程同时修改内存,则结果可能不一致。此外,只能为跟踪,停止的线程获取线程 context (寄存器和标志)。