从所有当前暂停的线程(托管)获取堆栈跟踪信息

时间:2012-03-13 16:07:02

标签: c# .net wpf windows debugging

我有一个Windows c#应用程序(WPF) - 它非常庞大,并且正在进行大量的多线程处理。

我的问题是我知道应用程序首先存在于应用程序中的几个死锁 - 其次 - 我害怕在没有检测到潜在新应用程序的情况下发布它并且没有以某种方式向我们报告的能力

该应用程序有一个伴侣 - 一个名为Launcher的小型可执行文件(wpf c#) - 它用于从自身启动实际进程。

为什么呢?因为我在主应用程序崩溃时将所有错误和外部输出重定向到启动器。

反过来 - 当检测到崩溃时 - 启动程序启动另一个可执行文件 - BugReports - 将错误信息传递给它。

稍后 - BugReports提交此信息,一些用户向Web服务输入了评论。

设置如下:

启动器 - 用于启动主应用程序并检测它何时退出 MainApp - 由Launcher发起 BugReports - 由Launcher发起 - 当检测到崩溃时。 Launcher获取的崩溃信息通过命令行传递给BugReports。它将信息提交给Web服务。

我知道困惑:)

这适用于未处理的例外对接.....

在最新版本的Launcher中,我决定集成一个WatchDog计时器。它应该每隔30秒监视一次MainApp并检测它是否处于锁定状态(例如死锁)。

如果它检测到 - 它会杀死它并再次启动BugReports。

完美运行 - 每次MainApp停止时 - 都会检测到它并且所有必要的过程都按预期工作。

问题:

我需要以某种方式获取MainApp中线程状态的'快照' - 它们在哪里(模块,方法),它们处于什么状态以及我可以获得的任何更有用的信息,以便我们可以找到潜力的位置死锁已经发生。

现在我抬头看了一半互联网,我无法按照我想要的方式找到这样的东西。

基本上 - 我的想法是获得鸟眼外观 - 好像我在视觉工作室调试器中暂停MainApp并且可以检查每个线程在哪里以及问题是什么。

这可能吗?

我应该深入了解哪些指南?

谢谢, 马丁K。

3 个答案:

答案 0 :(得分:1)

这可能但不容易!如果你自己写作,你即将开始一些非常有趣但又耗时的事情。 一旦我必须做同样的事情(或多或少),我使用MSE (Managed Stack Explorer)。它托管在CodePlex上,您可以在没有任何用户界面的情况下使用其核心库(以便在您的工具中实现完美集成)。

答案 1 :(得分:0)

考虑使用minidump而不是堆栈(注意隐私问题)。

请查看错误报告What is the best way to collect crash data?,包括有关Windows Error Reporting的信息以及此主题 - Recreate stack trace with line numbers from user bug-report in .net?

您也可以使用MiniDumpWriteDump自行创建minidump。

注意:进程转储包含用户的个人信息。您应该确保了解与将用户的个人信息复制到您的计算机相关的问题和规定。隐私问题也适用于其他崩溃/挂起报告。

答案 2 :(得分:0)

调试器 - > Windows - >并行堆栈

我认为这是VS2012最新版本的新功能,并且存在于VS2013中,我不确定。我实际上今天早上才发现这个...

http://msdn.microsoft.com/en-us/library/dd998398.aspx

我希望这可以帮助任何偶然发现这个帖子的人!非常酷的功能!