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