如何使用 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 值来模拟它们。
我试图在进程调用 wait()、read()、recvfrom() 或类似函数时取消,因为如果我在其上使用 ptrace,在 PTRACE_ATTACH 之后 PTRACE_CONT ,我的跟踪器被阻塞,直到跟踪器中的函数 returns。我也认为它发生在 sleep() 上。
是否可以取消调用,或复制一个假的 return?
谢谢。
是的,您应该发送 PTRACE_INTERRUPT
。这将触发系统调用退出。
为此,您无需 waitpid
跟踪对象,因为那样也会阻止您(跟踪者)。
您可以有多个线程:一个将阻塞在被跟踪者上,一个将 "decide" 取消阻塞系统调用 - 例如用户将按下的 GUI 线程 "cancel"(就像普通的调试器,例如 GDB)。
或者您可以使用 PTRACE_SYSCALL
手动诊断程序正在执行的每个系统调用,然后先发制人地决定是否要执行该系统调用。通过这种方式,您可以决定根本不使用 运行 wait
,或者通过使用 return 值来模拟它们。