如何获取Linux上任何线程的pc寄存器?

时间:2010-11-01 08:40:17

标签: assembly

我的调试线程将监视内存使用情况。当它发现不一致情况时,它将生成一个coredump。

正如我发现的那样,coredump不是很准确(看起来比问题发生的时间晚了一点,因为我需要在abort()之前的调试线程中进行一些清理。)

我想在那时记录线程val的确切%pc寄存器,我该怎么做?

1 个答案:

答案 0 :(得分:1)

获取“最近的”%pc - 程序计数器的一种方法 - (也称为%ip 指令指针)是使用makecontext

保存您的流程状态
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);

并在REG_EIP

中定义的缓冲区中读取正确的值:sys/ucontext.h
context.uc_mcontext.gregs[REG_EIP];

请注意,数据结构显然与机器有关,例如,如果您使用的是SPARC,则%ip将存储在REG_RIP

-

据我所知,没有办法为所有线程读取此值,您必须阅读每个线程的%pc,并手动收集数据。