【发布时间】:2018-02-20 10:18:03
【问题描述】:
当进程调用 wait()、read()、recvfrom() 或类似方法时,我试图取消,因为如果我在其上使用 ptrace,在 PTRACE_ATTACH 和之后的 PTRACE_CONT 之后,我的跟踪器会被阻塞,直到跟踪返回。我也认为 sleep() 也会发生这种情况。
是否可以取消通话,或重现虚假退货?
谢谢。
【问题讨论】:
标签: system-calls nonblocking ptrace
当进程调用 wait()、read()、recvfrom() 或类似方法时,我试图取消,因为如果我在其上使用 ptrace,在 PTRACE_ATTACH 和之后的 PTRACE_CONT 之后,我的跟踪器会被阻塞,直到跟踪返回。我也认为 sleep() 也会发生这种情况。
是否可以取消通话,或重现虚假退货?
谢谢。
【问题讨论】:
标签: system-calls nonblocking ptrace
是的,您应该发送PTRACE_INTERRUPT。这将触发系统调用退出。
为此,您无需在您的被跟踪者上waitpid,因为这也会阻止您(跟踪者)。
您可以拥有多个线程:一个会在被跟踪者上阻塞,一个会“决定”取消阻塞的系统调用 - 例如用户将按下“取消”的 GUI 线程(如普通调试器,例如 GDB)。
或者您可以使用PTRACE_SYSCALL 手动诊断程序正在执行的每个系统调用,然后先发制人地决定是否要执行该系统调用。通过这种方式,您可以决定根本不运行 wait,或者通过返回值来模拟它们。
【讨论】: