【问题标题】:Is there a way to view the register contents of one thread from another thread within the same process?有没有办法从同一进程中的另一个线程查看一个线程的寄存器内容?
【发布时间】:2015-11-13 20:10:29
【问题描述】:
假设我有一个包含三个线程的进程:A、B 和 C。
我想使用线程 A 暂停线程 B,检查线程 B 的寄存器值/堆栈内容,然后将线程 B 中的一些信息提供给线程 C(通过线程 A)。
根据 Linus Torvalds 的 this 帖子,ptrace 系统调用在这里不起作用,因为线程在同一个进程中。
还有其他方法可以做到吗?
更新:this 问题讨论了为什么它不起作用;我想知道是否存在不涉及创建子进程的解决方法。
【问题讨论】:
标签:
c
linux
multithreading
pthreads
ptrace
【解决方案1】:
您也许可以使用信号解决此问题。选择一个其他未使用的信号,例如SIGUSR1,并使用struct sigaction 的sa_sigaction 成员并指定SA_SIGINFO 标志为其安装信号处理程序。阻塞除感兴趣线程(线程 B)之外的每个线程中的信号。
当你想检查线程 B 时,使用pthread_kill() 向它发送一个线程导向的信号。然后信号处理程序将被触发,它的第三个参数将是一个指向ucontext_t 结构的指针。此结构的uc_mcontext 成员是一个与机器相关的mcontext_t 结构,它将包含线程中断时的寄存器值。
然后,您只需设计一种安全的方法将这些值传回线程 A。