有没有办法在同一进程中查看来自另一个线程的一个线程的寄存器内容?

时间:2015-11-13 20:10:30

标签: c linux multithreading pthreads ptrace

假设我有一个包含三个主题的进程:A,B和C.

我想使用线程A暂停线程B,检查线程B的寄存器值/堆栈内容,然后将线程B中的一些信息提供给线程C(通过线程A)。

根据Linus Torvalds发表的this帖子,ptrace系统调用在这里不起作用,因为线程在同一个进程中。

还有另一种方法可以实现这个目标吗?

更新:this问题讨论为什么它不起作用;我想知道是否存在不涉及创建子进程的变通方法。

1 个答案:

答案 0 :(得分:2)

您可以使用信号解决此问题。选择一个未使用的信号,例如SIGUSR1,并使用sa_sigaction的{​​{1}}成员并指定struct sigaction标志为其安装信号处理程序。阻止除感兴趣的线程(线程B)之外的每个线程中的信号。

如果要检查线程B,请使用SA_SIGINFO向线程发送线程信号。然后信号处理程序将触发,其第三个参数将是指向pthread_kill()结构的指针。此结构的ucontext_t成员是与机器相关的uc_mcontext结构,它将包含线程被中断时的寄存器值。

然后,您只需要设计一种安全的方法将这些值传递回线程A。