Необработанное исключение в финализаторе не из нашего кода - PullRequest
3 голосов
/ 18 октября 2019

Как мы можем решить необработанное исключение, сгенерированное финализатором , которое явно не происходит из нашего кода ?

К событию AppDomain.CurrentDomain.UnhandledException мы однажды внекоторое время регистрировать исключение, которое не приходит из нашего кода и завершает программу. Трассировка стека начинается с метода Finalize() и вызывается для класса A, который мы нигде не используем.

Вопросы

  1. Можем ли мыкаким-то образом обнаружить библиотеку / NuGet / project , что вызывает это?
  2. Можем ли мы сделать хакерский хардкор , например:
    • Изменение GCповедение (перехват исключений в финализаторе, печать неисправного объекта ...)
    • Постоянное нахождение всех экземпляров A в памяти и либо распознавание его источника (что создало их или имеет ссылку на них), либо вызов их финализаторамы сами в нужный момент пытаемся поймать?
  3. Что-то еще?

СПЕЦИФИЧЕСКАЯ ИНФОРМАЦИЯ:

Запускается полная трассировка стекас рамками 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()

1 Ответ

0 голосов
/ 24 октября 2019

На мой взгляд, единственное решение, которое остается здесь, - это разделить вашу программу на несколько меньших подпрограмм, если это возможно, и запустить их все по отдельности, чтобы найти неисправный плагин. Подпрограммам не нужно выполнять значимую часть работы, которую выполняет вся программа. Это только для теста.

...