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

标签 windows stack windbg

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

最佳答案

(可以找到定义 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

关于windows - 如何在 Windows 上获取线程堆栈信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918375/

相关文章:

Java - 堆栈 - 检查堆栈的 2 个数字是否等于 100

asp.net - asp.net 应用程序中的内存泄漏 - W3WP 和 gen 2 堆持续增长,直到 AppPool 回收

windows - Windows 上可以静默部署的 rsync 式解决方案?

windows - 批处理脚本 - 等到网络建立

windows - 有关 SEE_MASK_NOZONECHECKS 环境变量的文档

java - 我的项目中的 pop() 方法出错

java - 使用堆栈错误进行后缀评估(java)

.net - 使用 Windbg SOS 扩展单步执行源代码

Windbg 伪寄存器扩展

Windows 10 上的 Java Thread.sleep() 在 S3 sleep 状态下停止