【问题标题】:How to retrieve the register information of the specified thread in Linux?如何在Linux中检索指定线程的寄存器信息?
【发布时间】:2013-07-01 22:40:30
【问题描述】:

看这个:

(gdb) info reg
rax            0x7ffff00008c0   140737219922112
rbx            0x7ffff7fe9700   140737354045184
rcx            0x33d9e182a0 222698767008
rdx            0x7ffff7fe9a10   140737354045968
rsi            0x7ffff00008c0   140737219922112
rdi            0x0  0
rbp            0x7ffff7fe8e50   0x7ffff7fe8e50
rsp            0x7ffff7fe8e30   0x7ffff7fe8e30
r8             0x400afb 4197115
r9             0x0  0
r10            0x7ffff7fe8bb0   140737354042288
r11            0x33d9c0c480 222696621184
r12            0x33d9c11200 222696641024
r13            0x7ffff7fe99c0   140737354045888
r14            0x0  0
r15            0x3  3
rip            0x4008c1 0x4008c1 <write_to_thread_log(char const*)+29>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0

我的问题是: Linux下哪个接口可以实现这个功能? 我的平台:Linux 2.6.32-279.el6.x86_64 x86_64 GNU/Linux 非常感谢您的帮助。

【问题讨论】:

  • 请注意,我删除了“核心”标签,因为它太模棱两可了。

标签: c linux unix cpu-registers


【解决方案1】:

ptrace 系统调用是 Linux 中的标准调试工具,GDB 使用它与正在调试的其他进程进行交互。 GDB 可能通过PTRACE_GETREGSPTRACE_GETREGSET 请求获取此信息。

【讨论】:

  • 谢谢。 ptrace() 系统调用提供了一种方法,父进程可以通过该方法观察和控制另一个进程的执行。但是如何获取指定线程的寄存器信息。像 Windows-API:GetThreadContext()。
  • 使用 PTRACE_GETREGS 参数,就像 Jonathon 说的那样。
  • 你能给我一个演示吗?像这样: void func(pthreat_t tid, void *reg_info) { //? }
  • @JonathonReinhart 关于 ptrace(),我只看到了 'pid_t' 参数,但是 'pthread_t' 参数在哪里?
  • pid_t 是 int,pthread_t 是 unsigned long。如何将 pthread_t 转换为 pid_t?不安全。
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多