Uncatchable .NET runtime 2.0 ошибка - пользовательский компьютер - что дальше? - PullRequest
3 голосов
/ 19 октября 2010

Положение:

У меня есть приложение, которое активно использует http-соединения (потоковое приложение), и оно должно работать круглосуточно. И это делает.

Однако иногда происходит сбой с ошибкой во время выполнения, которая нигде не обнаруживается, и выводится в журнал событий:

Event Type: Error
Event Source:   .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID:   5000
Date:       13.10.2010
Time:       11:02:30
User:       N/A
Computer:   STREAM01
Description:
EventType clr20r3, P1 streamsink.exe, P2 1.0.0.42484, P3 4c880fd9, P4 mscorlib, P5 2.0.0.0, P6 4add54dc, P7 344a, P8 21c, P9 system.io.ioexception, P10 NIL.

Мой вопрос: как узнать, какая строка кода вызвала сбой. Я развертываю .PDB с двоичными файлами, но ... Что делать?

Цель - Windows XP, Framework - 2.0

EDIT:

Я уже это реализовал:

    static public void InitializeExceptionHandler(string AppName) {
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException+=new UnhandledExceptionEventHandler(currentDomain_UnhandledException);
        _appName=AppName;
    }

Нет, это не работает!

Ответы [ 4 ]

4 голосов
/ 19 октября 2010

Зарегистрируйте необработанное исключение текущего домена в точке входа (Main () или ...):

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

Реализация регистрации в обработчике:

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // log
        }

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

ОБНОВЛЕНИЕ

В соответствии с имеющимся обновлением я предлагаю вам загрузить средства отладки для Windows http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx, затем включите посмертную отладку и убедитесь, что создан аварийный дамп (см. Раздел «Включение послеубойной отладки» в файле справки Windbg), и используйте Windbg для отладки дампа, чтобы выяснить, где он аварийно завершился.

3 голосов
/ 19 октября 2010

Может быть, эта статья будет полезна Простой класс для отлова необработанных исключений в WinForms

ОБНОВЛЕНИЕ:

Это очень странно.1008 *, напишите пакетный файл и попросите клиента запустить его, когда он увидит сообщение об ошибке.Получить дамп и попытаться исследовать его через WinDbg или VS 2010. Здесь еще немного информации.

Также проверьте: Создание и анализ мини-дампов в производственных приложениях .NET .Если вы новичок в WinDbg, проверьте блог Тесс Феррандез

Другой способ - Настройка удаленной отладки

2 голосов
/ 19 октября 2010

Вы можете использовать Adplus для автоматического сохранения минидампа при возникновении исключения. Подробности смотрите в этом вопросе: Самый быстрый способ взломать WinDbg для конкретного исключения? Приложение .net 4.0.

1 голос
/ 19 октября 2010

Если вы не можете реализовать решение для обработки исключений, вы можете внедрить некоторые журналы трассировки, чтобы сузить местоположение в коде и то, какой поток вызывает исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...