如何在Windows上获取线程堆栈信息?

我枚举过程中的所有线程通过CreateToolhelp32Snapshot函数。我想为每个线程获取一些基本的堆栈信息。更具体地说,我想获得栈底地址,如果可能的话,我想获得当前栈顶地址。基本上这是在WinDbg中使用~*k命令显示的信息。那么我怎样才能从线程的ID或HANDLE中获取堆栈信息呢?如何在Windows上获取线程堆栈信息?

回答:

(定义可以发现here。)

要获得堆栈界限:

THREAD_BASIC_INFORMATION basicInfo; 

NT_TIB tib;

// Get TEB address

NtQueryInformationThread(YOUR_THREAD_HANDLE, ThreadBasicInformation, &basicInfo, sizeof(THREAD_BASIC_INFORMATION), NULL);

// Read TIB

NtReadVirtualMemory(YOUR_PROCESS_HANDLE, basicInfo.TebBaseAddress, &tib, sizeof(NT_TIB), NULL);

// Check tib.StackBase and tib.StackLimit

要得到的值esp,只需使用GetThreadContext即可。

回答:

正如我所知,Toolhelp通过复制堆,模块,进程和线程的基本信息来工作。这不包括包含堆栈底部地址的TEB块。我认为你需要使用另一个API,调试器引擎API,它提供functions to examine the stacks

回答:

,而不必涉及到驱动程序开发工具包一个更简单的方法是这样:

NT_TIB* tib = (NT_TIB*)__readfsdword(0x18); 

size_t* stackBottom = (size_t*)tib->StackLimit;

size_t* stackTop = (size_t*)tib->StackBase;

回答:

__readfsdword()仅适用于当前线程。所以,NtQueryInformationThread()的变体更加灵活。

增加了一些声明,这是在ntdll.h错过:

typedef enum _THREADINFOCLASS { 

ThreadBasicInformation = 0,

} THREADINFOCLASS;

typedef LONG KPRIORITY;

typedef struct _CLIENT_ID {

HANDLE UniqueProcess;

HANDLE UniqueThread;

} CLIENT_ID;

typedef CLIENT_ID *PCLIENT_ID;

typedef struct _THREAD_BASIC_INFORMATION

{

NTSTATUS ExitStatus;

PVOID TebBaseAddress;

CLIENT_ID ClientId;

KAFFINITY AffinityMask;

KPRIORITY Priority;

KPRIORITY BasePriority;

} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;

以上是 如何在Windows上获取线程堆栈信息? 的全部内容, 来源链接: utcz.com/qa/262989.html

回到顶部