Windbg堆栈跟踪问题

时间:2009-02-24 16:16:02

标签: multithreading crash windbg managed

我正在调试托管代码的崩溃转储,当使用!threads来显示所有线程时,一些线程的异常字段值有各种异常。

我的问题是如何识别哪个异常是导致进程崩溃的根异常?任何想法为什么这么多线程与Exception值相关联 - 我认为应该只有一个线程(带有未处理的异常)导致进程崩溃,为什么这么多线程显示异常? : - )

提前谢谢, 乔治

以下是!threads的一部分输出示例,FooException和GooException是我的应用程序定义的异常类型。

48 f 14c4 000000001d8bc4a0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093365da0)   49 10 17e8 000000001acc26d0 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093364670)   50 11 135c 000000001acc3180 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000dd707f70)   51 12 1740 000000001aca2ec0 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000937e8a60)   52 13 814 000000001aca3970 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA GooException(000000009336c550)   53 14 6ac 000000001accb010 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093355f58)   54 15 1114 000000001accbac0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA   56 16 d44 000000001accc570 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA GooException(00000000933c0598)   58 17 ff4 000000001accd020 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000a8a39c48)   59 18 780 000000001accdad0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA   60 19 8fc 000000001acce580 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000abd5ff08)   61 1a 2e8 000000001accf030 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000ac163ea0)   62 1b 11e8 000000001d8bd010 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093367c78)   63 1c 1520 000000001d8bd5e0 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA   64 1d 1330 000000001d8be090 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000937d9540)   65 1e 7f8 000000001d8beb40 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(000000009339a038)   66 1f a70 000000001d8bf5f0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000937d8b88)   67 20 150 000000001d8c00a0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA   68 21 1628 000000001d8c0b50 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093355200)   69 22 1148 000000001d8c1600 200b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA GooException(000000009380ada8)   70 23 16a8 000000001d8c20b0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093365178)   71 24 1640 000000001d8c2b60 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(0000000093343a78)   72 25 1568 000000001d8c3610 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(000000009380cc08)

2 个答案:

答案 0 :(得分:4)

调试转储时,可以使用“〜”命令找到错误线程,然后在其中一个旁边找一个“。”。线程。然后您切换到该线程并运行 kb 。您应该在本机调用堆栈中看到对 RaiseException()的调用。

此外,一旦您知道了感兴趣的线程,就可以运行!clstack 来获取托管调用堆栈。

您还可以在线程上运行!pe 以转储(!PrintException)输出。

这应该可以帮到你...根据我概述的步骤随意评论和分享更多数据,我们应该能够快速解决这个问题

为了回答你的问题,似乎在一段时间内异常在线程上,!threads输出将指示这一点。所以看起来你有很多可以追踪的激励。

另一项技术(值得另一个标签: - )

要跟踪其他异常,您可以使用Visual Studion并在UI中启用中断抛出异常。如果您大胆,可以运行Mdbg并运行以下命令来捕获抛出的异常

Open a VS.NET 2005/2008 Command Prompt
mdbg
>pro //Lists the processes
>a <PID> //attach to the processes
>ca ex //catches all exceptions
>g //go until break
//When it breaks on an exception
>where -v -c 200 // dumps the managed call stack (verbose) with a count of 200 frames
>print //prints out locals on the stack
>g //go to next exception
>de //Detach when done.. process stays running
>q //Quit the debugger

关于 MDbg 的好处是你可以进行源代码级调试。 (也许我会为这些创建一个 MDbg 标签)

谢谢, 亚伦

答案 1 :(得分:1)

George2,    你试过命令“!analyze -v”吗?你加载了sos dot net调试器扩展吗? (尝试使用.chain命令查看它是否在那里)。分析-v非常有帮助。 。