【问题标题】:Obtaining stack trace info from all currently paused threads (managed)从所有当前暂停的线程(托管)获取堆栈跟踪信息
【发布时间】:2012-03-13 16:07:02
【问题描述】:

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

我的问题是,我知道应用程序中存在的几个死锁首先 - 其次 - 我害怕在没有检测潜在新死锁的方法并且无法以某种方式向我们报告的情况下释放它.

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

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

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

稍后 - BugReports 提交此信息,一些用户将 cmets 输入到 Web 服务。

设置是这样的:

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

困惑我知道:)

这对于未处理的异常非常有效......

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

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

完美运行 - 每次 MainApp 停止时 - 它都会被检测到,并且所有必要的进程都可以正常工作。

问题:

我需要以某种方式获取 MainApp 中线程状态的“快照”——它们所处的位置(模块、方法)、它们所处的状态以及我可以获得的任何更有用的信息,以便我们找出潜在的位置发生了死锁。

现在我已经查了一半的互联网,但我无法以我想要的方式找到这样的东西。

基本上 - 这个想法是获得鸟瞰 - 就好像我在 Visual Studio 调试器中暂停 MainApp 并可以检查每个线程的位置以及问题所在。

这可能吗?

关于我应该深入研究什么的任何指导方针?

谢谢, 马丁·K。

【问题讨论】:

    标签: c# .net wpf windows debugging


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      考虑使用小型转储而不是堆栈(注意隐私问题)。

      查看此错误报告 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 自己创建小型转储。

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

      【讨论】:

      • 谢谢!经过大量工作,测试和阅读它正在工作:) 我还必须从客户端机器上复制 SOS.dll 文件,因为有时它似乎无法从符号服务器获得,但现在很棒!
      【解决方案3】:

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

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

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

      我希望这可以帮助任何偶然发现此线程的人!非常酷的功能!

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多