Finalizer中未处理的异常,不是我们的代码提供的

问题描述 投票:2回答:1

我们如何解决终结器抛出的未处理异常,显然是不是来自我们的代码

通过事件AppDomain.CurrentDomain.UnhandledException,我们偶尔会记录一个Exception,它不是来自我们的代码,而是正在终止程序。 stacktrace以Finalize()方法开始,并在类A上调用,我们在任何地方都不会使用它。

问题

  1. 我们能否以某种方式检测库/ NuGet /项目,这是导致此的原因吗?
  2. 我们是否可以进行一些硬核破解,例如:
    • 更改GC行为(在终结器上捕获异常,打印故障对象...)
    • [在内存中连续查找A的所有实例并识别其起源(创建它们或对其进行引用),或在适当的时机尝试try时调用它们的终结器?
  3. 还有什么?

特定信息:

完整的堆栈跟踪从帧System.ComponentModel.Component.Finalize()System.IO.FileSystemWatcher.Dispose(Boolean disposing)开始。 FileSystemWatcher派生自Component类,因此在FileSystemWatcher上调用了终结器。

我们在代码中的任何地方都不使用类FileSystemWatcher。它可能来自某些NuGet,但我们使用了许多。我们的解决方案范围很广,没有任何线索,这可能会导致什么。我们使用在Linux上的dockers中运行的.Net Core 2.2。

记录的异常信息:

 AggregateException: One or more errors occurred. (Object reference not set to an instance of an object.); 
 InnerException: NullReferenceException: Object reference not set to an instance of an object. 

 Stacktrace: 
 at System.Threading.CancellationTokenSource.CallbackNode.<>c.<ExecuteCallback>b__10_0(Object s)
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
 --- End of stack trace from previous location where exception was thrown ---
 at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException)
 --- End of inner exception stack trace ---
 at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException)
 at System.IO.FileSystemWatcher.StopRaisingEvents()
 at System.IO.FileSystemWatcher.Dispose(Boolean disposing)
 at System.ComponentModel.Component.Finalize()
c# .net-core unhandled-exception finalizer
1个回答
-2
投票

我认为,唯一的解决方案是将程序分成一些较小的子程序,并分别运行所有子程序以查找有问题的插件。子程序不需要像整个程序那样做有意义的工作。它仅用于测试。

© www.soinside.com 2019 - 2024. All rights reserved.