Как мы можем решить необработанное исключение, созданное финализатором, которое явно происходит не из нашего кода?
По событию AppDomain.CurrentDomain.UnhandledException
мы время от времени регистрируем исключение, которое не исходит из нашего кода и завершает работу программы. Трассировка стека начинается с метода Finalize()
и вызывается в классе A
, который мы нигде не используем.
Вопросы
- Можем ли мы каким-то образом обнаружить библиотеку/NuGet/проект, которые вызывают это?
- Can we maybe do some hard core hack like:
- Changing GC behaviour (catching exceptions on finalizer, printing the faulted object ...)
- Постоянно находить все экземпляры
A
в памяти и либо распознавать их происхождение (что их создало или имеет на них ссылку), либо самим вызывать их финализатор в нужный момент в try catch?
- Что-то другое?
КОНКРЕТНАЯ ИНФОРМАЦИЯ:
Полная трассировка стека начинается с кадров System.ComponentModel.Component.Finalize()
и System.IO.FileSystemWatcher.Dispose(Boolean disposing)
. FileSystemWatcher
является производным от класса Component
, поэтому финализатор вызывается для класса FileSystemWatcher
.
Мы нигде в нашем коде не используем класс FileSystemWatcher
. Он может исходить от какого-то NuGet, но мы используем многие из них. Наше решение широкое, мы понятия не имеем, к чему это может привести. Мы используем .Net Core 2.2, работающий в докерах на Linux.
Зарегистрированная информация об исключении:
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()
System.Threading.CancellationTokenSource.ExecuteCallbackHandlers
, вызванная где-то Finalize. Ошибка также исходит из вашего приложения, иначе это будет исключение второго шанса. Хотя все это полезно знать, как это решит вашу проблему... а) улучшите ведение журнала, чтобы иметь возможность воспроизвести проблему, stackoverflow.com/questions/30326673/, b) откройте решение в ILSply и сохраните его как решение C#, найдите FileWatcher в пакете(ах) NuGet, вызывающем проблему. - person Jeremy Thompson   schedule 21.10.2019