Windbg:无法遍历托管堆栈

本文关键字:堆栈 遍历 Windbg | 更新日期: 2023-09-27 18:33:07

通过Adplus,我附加了一个进程(在我的iis中,我运行了一个网站)

C:'Program Files (x86)'Debugging Tools for Windows (x86)>ADPlus -crash -pn w3wp .exe -o C:'dumps

以下是重现该网站的堆栈溢出异常的代码:

protected void Page_Load(object sender, EventArgs e)
{
}
public void Hello()
{
    Hello();
}
protected void Button_Test_Click(object sender, EventArgs e)
{
    Hello();
}

为我创建的转储位于:

C:'Dumps'Crash_Mode__Date_05-04-2012__Time_21-44-2020'PID-12452__W3WP.EXE_DefaultAppPool__1st_chance_Process_Shut_Down__full_2bc0_2012-05-04_21-45-53-704_30a4

我在windbg中打开了这个转储并运行了这些命令

0:000> .loadby sos clr
0:000> !clrstack

我收到了以下消息

Unable to walk the managed stack. The current thread is likely not a 
managed thread. You can run !threads to get a list of managed threads in
the process

你能帮我修复它吗?如何跟踪错误的位置?

Windbg:无法遍历托管堆栈

这将返回每个线程的堆栈跟踪,您将能够看到托管线程的堆栈跟踪: ~*e !clrstack

您可以键入 !pe 以获取异常,或键入 ~#s 以切换到出错的线程。

正如 Remus 指出的那样,当前线程不是托管线程。 ~ 在 windbg 上会给你线程列表,如果你仔细观察(我的坏显示器让我:P变得更糟)有一个.(点)在当前线程之前。您需要将其更改为托管线程 - 您可以通过 ~s 执行此操作。

现在我将调用调试大师来帮助我 - 如何找到哪个线程是托管线程?一位同事告诉我,通常线程 0 是托管的,我能够逃脱,直到这个问题:|<</p>

div class="answers>

只需按照 ms 教程:https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-managed-code

介绍了如何为托管代码和两种方案加载所需扩展的正确版本:1) 从同一台计算机转储和 2) 从其他计算机转储。