C# Windbg:无法遍历托管堆栈

C# Windbg:无法遍历托管堆栈,c#,asp.net,.net,windbg,adplus,C#,Asp.net,.net,Windbg,Adplus,通过Adplus我附加了一个进程(在我的iis中我运行了一个网站) 以下是复制该网站stackoverflow异常的代码: protected void Page_Load(object sender, EventArgs e) { } public void Hello() { Hello(); } protected void Button_Test_Click(object sender, EventArgs e) { Hello(); } 为我创建的转储位于: C:

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

以下是复制该网站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

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

你可以打字!pe获取异常,或~#s切换到故障线程!clrstack应该可以工作。

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


现在我将调用调试专家来帮助我-如何找到哪个线程是托管线程?一位同事告诉我,通常情况下,线程0是托管线程,我可以逃避,直到出现以下问题:|

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

当前线程可能不是托管线程。您可以运行
!线程
以获取进程中托管线程的列表。这就是我所困惑的。我运行了一个web应用程序。在浏览器的一个页面上单击按钮,应用程序将关闭。非托管线程在哪里扮演角色?所有托管应用程序都托管在一个进程中。没有“管理流程”概念。因此,所有托管应用程序都将具有非托管线程。此外,为什么要使用x86工具?你不是真的在运行32位代码,是吗?我如何获得转储的堆栈跟踪?是的,在我的taskmanager中显示w3wp.exe*32正在运行。
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