2013-07-05 28 views
2

GetThreadContext是一個Windows API。如何在Linux/Unix中實現GetThreadContext?

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

回答

3

一個Linux特有的方式是使用get_thread_area()。從get_thread_area()手冊頁:

get_thread_area()返回當前線程的線程本地存儲(TLS)陣列的條目。該條目的索引對應於用戶傳入的值u_info->entry_number。如果值處於邊界內,則get_thread_area()將相應的TLS條目複製到u_info指向的區域中。

但是,如果您想讀取寄存器值,則需要藉助內聯彙編。福克斯例如,要檢索的ESP,你可以使用下面的內聯彙編值:

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

通過這種方式,你可以提取ebpeip等希望這將有助於!