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试图自由读/写的内存。
答案 0 :(得分:0)
是的,您可以读取全局内存,但如果正在运行的线程同时修改内存,则结果可能不一致。此外,只能为跟踪,停止的线程获取线程 context (寄存器和标志)。