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