如何在Linux / Unix中实现GetThreadContext?

时间:2013-07-05 03:59:12

标签: linux windows cpu-registers

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.
    ??
}

1 个答案:

答案 0 :(得分:2)

获取线程信息的特定于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等。希望这会有所帮助!