multithreading - Windbg堆栈跟踪问题

标签 multithreading crash windbg managed

我正在调试托管代码的故障转储,当使用!threads在此处显示所有线程时,几个线程具有Exception字段值以及各种异常。

我的问题是如何快速确定哪个异常是导致流程崩溃的根异常?为什么会有这么多线程与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
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 18780 000000001accdad0 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA
60 19 8fc 000000001acce580 b020已启用0000000000000000:0000000000000000 0000000000162080 0 MTA FooException(00000000abd5ff08)
61 1a 2e8 000000001accf030b020已启用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 20150 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)

最佳答案

在调试转储时,可以使用“〜” 命令找到有问题的线程,然后查找“”。其中一个线程旁边的。然后,您切换到该线程并运行 kb 。您应该在本地调用堆栈中看到对 RaiseException()的调用。
您也可以在知道感兴趣的线程后运行!clstack 以获取托管调用堆栈。
您也可以在线程上运行!pe 以转储(!PrintException)输出。

这应该可以帮助您更好地利用自己的知识。根据我概述的步骤,随时发表评论并分享更多数据,我们应该能够迅速解决此问题

为了回答您的问题,似乎在一段时间内线程上有异常,!threads输出将指示该情况。因此,您似乎有很多需要追寻的东西。

另一种技术(值得另一个TAG :-)

要跟踪其他异常,可以使用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 标记)

谢谢,
亚伦

关于multithreading - Windbg堆栈跟踪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582404/

相关文章:

c# - 后台线程/进程

c++ - 跨线程访问类的段错误

c++ - MSVC++ 6.0 devshl.dll 错误

android - 如何从 Cordova 插件类强制 Android 应用程序崩溃?

.net-4.0 - 无法附加到 .net 4.0 中的进程

c++ - 多线程的循环大小是多少?

java - 等待多线程时的最佳实践 - 时间、计数或其他?

java - 无法从图库中导入正常大小的图像

dll - 尽管加载了私有(private) pdb 文件,WinDBG 不显示源代码行

c# - 如何调试托管堆中的损坏