gpt4 book ai didi

.net - 在生产 .NET 桌面程序中诊断应用程序挂起

转载 作者:行者123 更新时间:2023-12-04 19:24:54 26 4
gpt4 key购买 nike

我有麻烦了。我正在开发的应用程序的用户之一偶尔但经常遇到应用程序挂起。

发生这种情况时,我们会在机器的事件日志中找到一个来源为“应用程序挂起”的条目,其中包含信息性消息“挂起应用程序 [我的应用程序],版本 [正确版本],挂起模块挂起应用程序,版本 0.0.0.0,挂起地址 0x00000000。”

我正在记录我的应用程序抛出的所有未处理的异常,发生这种情况时我的日志文件中没有任何条目。

我目前的工作假设是,在应用程序调用不安全的遗留 API 期间会发生这种挂起。这不会让我感到惊讶;我使用这个 API 已经很多年了,虽然我以前没见过它挂起,但它确实是很糟糕的代码。此外,用户报告该程序似乎随机挂起。我不认为这是真的。并不是我不相信她,而是与遗留 API 对话的代码在 BackgroundWorker 调用的方法中运行。如果后台线程使应用程序挂起,这在用户看来很可能是随机发生的。

所以,我有两个问题,一个具体的,一个一般的。

具体问题:我希望如果在非 UI 线程上运行的方法挂起,它只会杀死线程。它真的会杀死整个应用程序吗?

一般问题:

我已经记录了所有未处理的异常。我的程序已经设置为使用跟踪(尽管我需要添加检测代码来跟踪可疑方法中的事件)。还有其他我应该做的事情吗?当 .NET 应用程序挂起时,是否有允许进行某种崩溃后分析的诊断工具? .NET 框架中是否有我可以调用的机制来捕获更多(和更有用的)数据?

编辑:仔细检查我的代码,我记得它对 BackgroundWorker 的所有使用都是通过我实现的实用程序类来包装异常处理程序中调用的方法。此处理程序记录异常,然后将其作为实用程序对象的属性返回。 UI 线程中的完成事件处理程序重新抛出异常(不太理想,因为我丢失了调用堆栈,但它已经被记录了),导致 UI 的主要异常处理程序将异常报告给消息框,然后终止应用程序。

由于这些都没有发生,我非常有信心在后台线程中没有抛出异常。好吧,无论如何,没有 .NET 异常(exception)。

进一步跟进:

幸运的是,我现在已经从用户那里获得了足够的数据,可以确定遗留 API 中没有发生挂起。这意味着这显然是我做错了,这意味着我可以修复它,所以,赢了。这也意味着我可以通过跟踪来隔离问题,这是另一个胜利。我对这个问题的答案感到非常高兴;我什至更高兴我可能不需要它们来解决这个问题。

另外:PostSharp 非常出色。如果您需要向现有应用程序添加检测代码,您几乎可以肯定应该使用它。

最佳答案

在回答您的具体问题时,当后台/工作线程阻塞或挂起时,对应用程序其余部分的影响在很大程度上取决于应用程序中线程之间发生的同步。没有特别的理由表明它一定会挂起整个应用程序,但它完全有可能会挂起。

诊断此问题的一种可能方法是在进程挂起时生成进程转储(假设有人在附近注意到它何时发生)。这将使用 MiniDumpWriteDump 来完成。 ,来自 dbghelp.dll。编写一个可以转储进程(基于其 pid)的简单工具相当简单,该工具可以提供给遇到问题的客户。由于这是一个托管应用程序,因此最好使用完整的内存转储 (MiniDumpWithFullMemory),但普通转储仍应包含一些有用的信息。获得转储后,您可以使用 windbg 或您选择的事后调试器来查看可能发生的情况。

如果你走这条路,this msdn article是托管转储调试的良好起点。

关于.net - 在生产 .NET 桌面程序中诊断应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/202384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com