如何使用 ptrace() 取消等待 return 的进程

How to cancel a process waiting to return with ptrace()

我试图在进程调用 wait()、read()、recvfrom() 或类似函数时取消,因为如果我在其上使用 ptrace,在 PTRACE_ATTACH 之后 PTRACE_CONT ,我的跟踪器被阻塞,直到跟踪器中的函数 returns。我也认为它发生在 sleep() 上。

是否可以取消调用,或复制一个假的 return?

谢谢。

是的,您应该发送 PTRACE_INTERRUPT。这将触发系统调用退出。

为此,您无需 waitpid 跟踪对象,因为那样也会阻止您(跟踪者)。

您可以有多个线程:一个将阻塞在被跟踪者上,一个将 "decide" 取消阻塞系统调用 - 例如用户将按下的 GUI 线程 "cancel"(就像普通的调试器,例如 GDB)。

或者您可以使用 PTRACE_SYSCALL 手动诊断程序正在执行的每个系统调用,然后先发制人地决定是否要执行该系统调用。通过这种方式,您可以决定根本不使用 运行 wait,或者通过使用 return 值来模拟它们。