我有一个 .Net Compact Framework 3.5 应用程序,它使用 Nlog 2.0 版来记录信息、错误和致命异常。大多数情况下,日志记录会按预期工作,并在崩溃之前记录致命异常。但有时我们会观察到应用程序崩溃时没有留下任何错误/异常的迹象。
让我详细说明一下场景:
- 应用程序创建很少的线程,所有线程都在其调用堆栈的开头添加了 try-catch 块。因此记录胎儿
崩溃前的异常。
- 主线程有“AppDomain.CurrentDomain.UnhandledException”来记录其调用堆栈上的任何胎儿异常。
- 该应用程序确实加载了一些第三方托管的 dll,并对 Wnce dll 执行了一些 PInvoke。
但我相信,即使某些第三方 DLL 崩溃(或者说它创建了一个崩溃的新线程),我至少应该看到一些ThreadAbortExceptions
在日志中,由我的应用程序线程在退出之前记录。
Nlog的关键配置参数有:
A。文件目标.AutoFlush = true
b. FileTarget.KeepFileOpen= false
C。 FileTarget 未包装在任何异步包装器或任何缓冲中
包装纸。
如果我遗漏了什么,请告诉我。
崩溃的可能原因包括 OutOfMemory 异常或 StackOverflowException。来自后者的文档:
版本注意事项
在 .NET Framework 的早期版本中,您的应用程序可以捕获 StackOverflowException 对象(例如,从无界递归中恢复)。但是,目前不鼓励这种做法,因为需要大量附加代码才能可靠地捕获堆栈溢出异常并继续程序执行。
从 .NET Framework 2.0 版开始,StackOverflowException 对象无法被 try-catch 块捕获,并且默认情况下会终止相应的进程。因此,建议用户编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。请注意,托管公共语言运行时 (CLR) 的应用程序可以指定 CLR 卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续运行。有关更多信息,请参阅 ICLRPolicyManager 接口和托管概述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)