Нет признаков фатального исключения при сбое приложения | NLog версия 2 | Compact Framework 3.5 - PullRequest
1 голос
/ 04 января 2012

У меня есть приложение .Net Compact Framework 3.5, которое использует Nlog версии 2.0 для регистрации информации, ошибок и фатальных исключений.В большинстве случаев ведение журнала работает должным образом и регистрирует фатальные исключения перед сбоем.Но иногда замечается, что приложение падает, не оставляя никаких признаков ошибки / исключения.

Позвольте мне развить сценарий:

  1. Приложение создает несколько потоков, всепотокам добавлен блок try-catch в начале их стеков вызовов.И, следовательно, регистрируйте исключения плода перед сбоем.
  2. Основной поток имеет AppDomain.CurrentDomain.UnhandledException, чтобы регистрировать любые исключения плода в своем стеке вызовов.
  3. Приложение загружает некоторые сторонние управляемые библиотеки DLL.и выполняет некоторые PInvokes для Wnce dll.

Но я верю, что даже если какая-то сторонняя DLL-библиотека аварийно завершает работу (или, скажем, создает новый поток, который аварийно завершается), я должен хотя бы увидеть некоторые1015 * в журнале, зарегистрированном потоком моего приложения перед выходом.

Ключевые параметры конфигурации Nlog:

a.FileTarget.AutoFlush = true

b.FileTarget.KeepFileOpen = false

c.FileTarget не упакован ни в какую асинхронную оболочку или в какую-либо буферизованную оболочку.

Пожалуйста, дайте мне знать, если я что-то упустил.

1 Ответ

0 голосов
/ 04 января 2012

Возможные причины сбоя: исключение OutOfMemory или исключение StackOverflowException.Из документации для последнего :

Особенности версии

В предыдущих версиях .NET Framework ваше приложение могло перехватить объект StackOverflowException (например,оправиться от неограниченной рекурсии).Однако такая практика в настоящее время не рекомендуется, поскольку требуется значительный дополнительный код, чтобы надежно перехватить исключение переполнения стека и продолжить выполнение программы.

Начиная с .NET Framework версии 2.0, объект StackOverflowException не может быть перехвачен блоком try-catch, и соответствующий процесс завершается по умолчанию.Следовательно, пользователям рекомендуется писать свой код для обнаружения и предотвращения переполнения стека.Например, если ваше приложение зависит от рекурсии, используйте счетчик или условие состояния для завершения рекурсивного цикла.Обратите внимание, что приложение, в котором размещается общеязыковая среда выполнения (CLR), может указать, что CLR выгружает домен приложения, в котором возникает исключение переполнения стека, и позволяет соответствующему процессу продолжаться.Для получения дополнительной информации см. Обзор интерфейса и хостинга ICLRPolicyManager.

...