【问题标题】:How to implement GetThreadContext in Linux/Unix?如何在 Linux/Unix 中实现 GetThreadContext?
【发布时间】:2013-07-03 01:59:18
【问题描述】:

GetThreadContext 是一个 Windows API。

BOOL WINAPI GetThreadContext(
_In_     HANDLE hThread,
_Inout_  LPCONTEXT lpContext
);

我想知道如何在 linux 中实现它。 Linux中如何获取指定线程的寄存器信息?

像这样:

pthread_create(thread_id, ...);
...
func(thread_id, reg_info)
{
    //get the reg_info by thread_id.
    ??
}

【问题讨论】:

    标签: linux windows cpu-registers


    【解决方案1】:

    获取线程信息的特定于 Linux 的方法是使用 get_thread_area()。来自get_thread_area() 手册页:

    get_thread_area() 在当前线程的线程本地存储 (TLS) 数组中返回一个条目。该条目的索引对应于用户传入的u_info->entry_number 的值。如果值在边界内,get_thread_area() 将相应的 TLS 条目复制到 u_info 指向的区域中。

    但是,如果您想读取寄存器值,您需要借助内联汇编。 Fox 示例,要检索 esp 的值,您可以使用以下内联程序集:

    unsigned sp;
    __asm __volatile("movl %%esp, %0" : "=r" (sp));
    return sp;
    

    这样可以提取ebpeip等,希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2013-03-29
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      相关资源
      最近更新 更多