假设我有一个包含三个主题的进程:A,B和C.
我想使用线程A暂停线程B,检查线程B的寄存器值/堆栈内容,然后将线程B中的一些信息提供给线程C(通过线程A)。
根据Linus Torvalds发表的this帖子,ptrace
系统调用在这里不起作用,因为线程在同一个进程中。
还有另一种方法可以实现这个目标吗?
更新:this问题讨论为什么它不起作用;我想知道是否存在不涉及创建子进程的变通方法。
答案 0 :(得分:2)
您可以使用信号解决此问题。选择一个未使用的信号,例如SIGUSR1
,并使用sa_sigaction
的{{1}}成员并指定struct sigaction
标志为其安装信号处理程序。阻止除感兴趣的线程(线程B)之外的每个线程中的信号。
如果要检查线程B,请使用SA_SIGINFO
向线程发送线程信号。然后信号处理程序将触发,其第三个参数将是指向pthread_kill()
结构的指针。此结构的ucontext_t
成员是与机器相关的uc_mcontext
结构,它将包含线程被中断时的寄存器值。
然后,您只需要设计一种安全的方法将这些值传递回线程A。