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

本文关键字:托管 获取 信息 跟踪 堆栈 线程 暂停 | 更新日期: 2023-09-27 18:27:51

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

我的问题是,我知道应用程序中存在一些死锁,首先,其次,我害怕在没有检测潜在新死锁的方法和无法以某种方式向我们报告的情况下发布它

该应用程序有一个配套程序——一个名为Launcher的小型可执行文件(wpf c#)——它用于从自身启动真正的进程。

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

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

稍后,BugReports将此信息和一些用户输入的评论提交给web服务。

设置如下:

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

困惑我知道:)

这非常适用于未处理的异常。。。。。

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

如果它检测到这一点,它将杀死它并再次启动BugReports。

工作非常完美——每次MainApp暂停时,它都会被检测到,所有必要的流程都会正常工作。

问题:

我需要以某种方式获得MainApp中线程状态的"快照"——它们在哪里(模块、方法),它们处于什么状态,以及我可以获得的任何更有用的信息,这样我们就可以找出潜在死锁发生的位置。

现在我已经查了一半的互联网,但我找不到我想要的东西。

基本上,这个想法是为了获得鸟瞰图,就好像我在visual studio调试器中暂停MainApp,可以查看每个线程的位置以及问题所在

这可能吗?

关于我应该深入研究什么,有什么指导方针吗?

谢谢,Martin K.

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

这是可能的,但并不容易!如果你自己写,你即将开始一些非常有趣但耗时的事情。有一次我不得不做同样的事情(或多或少),我使用了MSE(托管堆栈资源管理器)。它托管在CodePlex上,您可以在没有任何用户界面的情况下使用其核心库(以便在您的工具中实现完美集成)。

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

查看此错误报告收集崩溃数据的最佳方式是什么?,包括关于Windows错误报告的信息,以及这个线程-用.net?中用户错误报告的行号重新创建堆栈跟踪?。

您也可以使用MiniDumpWriteDump自己创建小型转储。

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

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

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

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

我希望这能帮助任何偶然发现这条线索的人!真的很酷的功能!