是否可以读取另一个线程的程序计数器?
Is it possible to read another thread's program counter?
线程 A 可以(在 C 或 C++ 程序中,运行 在 64 位英特尔架构的 Linux 下)读取线程 B 的程序计数器寄存器的值,不需要任何特殊工具来线程 B 的代码?
(我意识到想要做的事情很奇怪;出现这种愿望只是因为我很好奇线程 A 是否可以使用它来检测线程 B 是否卡在失败的系统调用中,如所述)
On Linux,/proc/self/task/%d/stat
的字段30,其中%d
需要填写相关线程的内核tid,包含最后观察到的指令指针值对于线程。请参阅 http://man7.org/linux/man-pages/man5/proc.5.html 并注意它记录在 /proc/[pid]/stat
下,但当前进程下 task
目录中的版本是您想要用于定位线程的版本。
困难的部分可能是获取线程的内核 tid。最简单的方法是从线程调用 syscall(SYS_gettid)
并将其内核 tid 存储在某处。
线程 A 可以(在 C 或 C++ 程序中,运行 在 64 位英特尔架构的 Linux 下)读取线程 B 的程序计数器寄存器的值,不需要任何特殊工具来线程 B 的代码?
(我意识到想要做的事情很奇怪;出现这种愿望只是因为我很好奇线程 A 是否可以使用它来检测线程 B 是否卡在失败的系统调用中,如所述
On Linux,/proc/self/task/%d/stat
的字段30,其中%d
需要填写相关线程的内核tid,包含最后观察到的指令指针值对于线程。请参阅 http://man7.org/linux/man-pages/man5/proc.5.html 并注意它记录在 /proc/[pid]/stat
下,但当前进程下 task
目录中的版本是您想要用于定位线程的版本。
困难的部分可能是获取线程的内核 tid。最简单的方法是从线程调用 syscall(SYS_gettid)
并将其内核 tid 存储在某处。