Как мы можем решить необработанное исключение, сгенерированное финализатором , которое явно не происходит из нашего кода ?
К событию AppDomain.CurrentDomain.UnhandledException
мы однажды внекоторое время регистрировать исключение, которое не приходит из нашего кода и завершает программу. Трассировка стека начинается с метода Finalize()
и вызывается для класса A
, который мы нигде не используем.
Вопросы
- Можем ли мыкаким-то образом обнаружить библиотеку / NuGet / project , что вызывает это?
- Можем ли мы сделать хакерский хардкор , например:
- Изменение GCповедение (перехват исключений в финализаторе, печать неисправного объекта ...)
- Постоянное нахождение всех экземпляров
A
в памяти и либо распознавание его источника (что создало их или имеет ссылку на них), либо вызов их финализаторамы сами в нужный момент пытаемся поймать?
- Что-то еще?
СПЕЦИФИЧЕСКАЯ ИНФОРМАЦИЯ:
Запускается полная трассировка стекас рамками 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()