【发布时间】: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 感谢您的评论,下次我在现场时会检查
-
ExecutionEngineException或Environment.FailFast方法不能被应用程序代码捕获,它只写入事件日志 -
@PavelAnikhouski 使用 Windows 事件日志我发现这是由于数组复制操作而导致的 MemoryAccesViolationException。数组比结构大。随意发布这个作为答案,因为它回答了我的问题。再次感谢。