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