如何使用 WinDBG 列出所有托管线程的调用堆栈?

Posted

技术标签:

【中文标题】如何使用 WinDBG 列出所有托管线程的调用堆栈?【英文标题】:How to list call stack of all managed threads using WinDBG? 【发布时间】:2011-12-30 07:25:23 【问题描述】:

我有一个从托管应用程序创建的转储。我正在使用 SOS/SOSEX 扩展来简化我的转储分析。我想列出所有托管线程的调用堆栈,就像我们对本机应用程序进行~*kb 一样。我们如何做到这一点?

【问题讨论】:

【参考方案1】:

使用sos!EEStack 命令:

0:007> .load sos
0:007> !EEStack

见SOS.dll (SOS Debugging Extension)

【讨论】:

.loadby sos clr 更好(对于 .NET 4)或 .loadby sos mscorwks 对于 .net 4,我下载了 .net 4 版本的 sos,Psscor4 microsoft.com/en-gb/download/details.aspx?id=21255,将 dll 放入 windbg 文件夹 - 将正确的 dll 与正确的 windbg 版本(32 位|64 位)匹配,然后加载.load Psscor4.dll @sarat 看到 JasonE 的回答 !EEStack -short【参考方案2】:

此命令将转储所有托管线程

~*e!dumpstack

【讨论】:

请注意,这需要先通过.loadby sos clr加载适当的调试扩展 ~*e!clrstack【参考方案3】:

对于 sosex,使用 ~*e!mk (~ - 线程,* - all,e - 执行此命令,!mk - 显示托管堆栈。sosex 中的大多数命令镜像本机命令,但具有 m (管理)在他们面前。

【讨论】:

以上是关于如何使用 WinDBG 列出所有托管线程的调用堆栈?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用大量 CPU 快速获取线程的托管堆栈跟踪

在 Visual Studio 2008 中为 .Net 托管应用程序从 WinDbg 调试 .dmp 文件

实时调试堆栈溢出

CLR探索系列:Windbg+SOS动态调试分析托管代码

Windbg Call Stack窗口的使用

windbg 常用命令