【问题标题】:Application shutting down without notice应用程序关闭,恕不另行通知
【发布时间】:2020-06-12 13:12:59
【问题描述】:

我目前正在管理一个复杂的应用程序。它是用 C# 和 .Net 4.7.2 编写的。

有时这个程序会在没有通知的情况下关闭。即使在 Main 方法中使用 try/catch 块和 MessageBox.Show() 也没有错误消息(我知道这可能不是最好的方法,但应该可以工作)。

有多个线程在不同点运行,调用外部 DLL,有时甚至调用驱动程序。因此,为了记录是否是另一个线程导致整个事情崩溃,我在一开始就这样做了:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.ThreadException += Application_ThreadException;

因为我不确定哪一个是正确的。在这些方法中,我将异常(在执行空检查之后)记录到一个文件中(使用File.AppendText 和一个基于时间戳的文件)。

还是什么都没有。应用程序在随机时间(2 到 6 小时之间)后不断崩溃,我没有日志信息,没有错误消息,我有点迷路了。

该应用程序在发布模式下运行,我无法使用 Visual Studio 在其中运行调试器(因为这样会很容易)。也许还有另一种方法可以运行外部调试器?

谁能给我一个提示,告诉我如何赶上会导致应用程序静默崩溃的异常?

【问题讨论】:

  • 事件日志告诉你什么?
  • 我没有收到您的声明The app is running in Release mode and I cannot use Visual Studio to run the debugger 为什么不能附加到您正在运行的进程中? - docs.microsoft.com/en-us/visualstudio/debugger/… 但正如 @PavelAnikhouski 已经说过的,当您的应用程序崩溃时,它应该始终在 Windows 事件查看器中生成一个条目 - howtogeek.com/123646/…
  • @PavelAnikhouski 感谢您的评论,下次我在现场时会检查
  • ExecutionEngineExceptionEnvironment.FailFast 方法不能被应用程序代码捕获,它只写入事件日志
  • @PavelAnikhouski 使用 Windows 事件日志我发现这是由于数组复制操作而导致的 MemoryAccesViolationException。数组比结构大。随意发布这个作为答案,因为它回答了我的问题。再次感谢。

标签: c# .net exception


【解决方案1】:

根据您的解释,唯一让我想到的是您的应用程序中有一些 fire and forget 线程有时会抛出异常,但您的应用程序无法跟踪它们以记录或捕获它们的异常。

确保您的所有任务都已正确等待,并且您没有任何 async void 方法。

如果你真的需要在你的应用中使用一些 fire and forget 操作,至少在你的类中使用类似 private Task fireAndForgetTaskAliver 的东西来保持它们的活力。

另一个可能是您的应用中的内存泄漏导致堆栈溢出异常。

【讨论】:

【解决方案2】:

捕捉代码中任何地方都没有捕捉到的异常的唯一方法确实是在应用程序下的 Windows 事件日志中查看它。

感谢 Pavel Anikhouski 的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2021-05-19
    相关资源
    最近更新 更多