0
我的调试线程将监视内存使用情况。当它发现不一致的情况时,它会产生一个coredump。如何获得Linux上的任何线程的PC寄存器?
因为我发现,coredump不是很准确(看起来比问题发生的那一刻迟一点,因为我需要在abort()
之前在调试线程中进行一些清理)。
我想记录当时线程val的确切%pc
寄存器,我该怎么做?
我的调试线程将监视内存使用情况。当它发现不一致的情况时,它会产生一个coredump。如何获得Linux上的任何线程的PC寄存器?
因为我发现,coredump不是很准确(看起来比问题发生的那一刻迟一点,因为我需要在abort()
之前在调试线程中进行一些清理)。
我想记录当时线程val的确切%pc
寄存器,我该怎么做?
一种方式来获得一个“最近” %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
,然后手动收集您的数据。
报价: 据我所知,没有办法读取所有线程的这个值,你必须阅读它们每个的%pc,然后手动收集你的数据。 我的想法是使用专用线程来监视内存,它会生成coredump或记录$ pc,当它发现内存changed.but听起来我不能这样做? 是否有另一种好方法来监视内存(特别是内存覆盖),因为我不能使用valgrind或purify(它们在我的环境中太重了)。 非常感谢! – jon 2010-11-03 04:29:34
@jon:我真的不明白你想如何使用你的线程来监视内存的变化,也许你可以用更多的细节更新问题? – Kevin 2010-11-03 14:07:15