gpt4 book ai didi

c# - Finalizer 中未处理的异常不是来 self 们的代码

转载 作者:行者123 更新时间:2023-11-30 18:45:23 25 4
gpt4 key购买 nike

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

通过事件AppDomain.CurrentDomain.UnhandledException,我们偶尔会记录一个异常,该异常不是来 self 们的代码并且正在终止程序。堆栈跟踪以 Finalize() 方法开始,并在我们未在任何地方使用的类 A 上调用。

问题

  1. 我们能否以某种方式检测到导致此问题的库/NuGet/项目
  2. 我们可以做一些硬核黑客,例如:
    • 改变 GC 行为(在终结器上捕获异常,打印错误对象......)
    • 不断在内存中找到 A 的所有实例,并识别其来源(是什么创建了它们或引用了它们),还是在 try catch 的正确时刻我们自己调用了它们的终结器?
  3. 还有别的吗?

具体信息:

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

我们不在代码中的任何地方使用类 FileSystemWatcher。它可能来自某些 NuGet,但我们使用其中的许多。我们的解决方案范围很广,我们不知道它会导致什么。我们使用在 Linux 上的 docker 中运行的 .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# - Finalizer 中未处理的异常不是来 self 们的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58444716/

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