【问题标题】:Windbg: Unable to walk the managed stackWindbg:无法遍历托管堆栈
【发布时间】:2012-05-04 16:33:12
【问题描述】:

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

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

下面是重现该网站stackoverflow异常的代码:

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

你能帮我修一下吗?如何追踪错误的位置?

【问题讨论】:

  • 当前线程可能不是托管线程。您可以运行!threads 来获取进程中的托管线程列表。
  • 这就是我所困惑的。我运行了一个网络应用程序。单击浏览器一页上的按钮,应用程序将关闭。非托管线程在这里扮演什么角色?
  • 所有托管应用程序都托管在一个进程中。没有“托管过程”的概念。因此,所有托管应用程序都将具有非托管线程。
  • 另外,你为什么要唱 x86 工具?你不是真的在运行 32 位代码,是吗?
  • 如何获取转储的堆栈跟踪信息?是的,在我的任务管理器中,它显示 w3wp.exe*32 正在运行。

标签: c# asp.net .net windbg adplus


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以输入 !pe 来获取异常,或者输入 ~#s 来切换到故障线程。 !clrstack 应该可以工作了。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        按照ms教程操作即可:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugging-managed-code

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

        【讨论】:

          猜你喜欢
          • 2016-01-12
          • 2016-08-13
          • 2011-08-04
          • 1970-01-01
          • 2016-04-16
          • 2011-12-30
          • 2012-02-17
          • 2020-01-19
          • 2014-06-05
          相关资源
          最近更新 更多