Asp. net необработанное исключение при обратном вызове таймера, сбой w3wp и ошибка не регистрируется - PullRequest
0 голосов
/ 18 февраля 2020

Я испытываю случайное необработанное исключение, приводящее к тому, что w3wp превращается в sh. Я хочу отследить причину этого исключения. У меня уже есть глобальное переопределение обработчика Application_Error в моем классе MvcApplication, поэтому cra sh должен быть вызван некоторым исключением из контекста http-context. Чтобы воспроизвести проблему, я сам генерирую ее в обратном вызове таймера и пытаюсь ее отследить. Упрощенный код, такой как

public static class MonitorTimers
{
    public static Timer _taskMonitorTimer = new Timer(state: null, dueTime: 1000, period: 1000, callback: (state) =>
    {
        throw new Exception("Ouch! Me dead.");
    });     
}

В моей локальной среде разработки (iis express, выпущенной VS2017) и тестовой среде (IIS 8.5), когда приложение запускается и затем падает, в средстве просмотра событий можно увидеть следующее :

enter image description here

Наиболее полезные события 1325 и 1026, полученные из ASP.NET и .NET Runtime, показывают трассировку стека - только то, что мне нужно.

Моя проблема в том, что на моей рабочей машине (также IIS 8.5) я не могу найти полезное событие 1325. Только отчет cra sh, содержащий не больше информации, чем я знаю. Так что я не знаю, что вызвало ошибку. Я мог бы окружить свой обратный вызов таймера блоком try ... catch, но ошибка могла быть вызвана чем-то другим (неуправляемые библиотеки, ошибка в инициализации класса stati c), тогда я все еще не могу отследить.

Так что предложения о том, почему отсутствует событие 1325 или какие-то инструменты, которые могут показать журнал и проанализировать трассировку стека, очень приветствуются. Спасибо.

enter image description here

1 Ответ

0 голосов
/ 18 февраля 2020

Итак, в вашем случае вы генерируете Exception diring Загрузка домена приложения. Когда CLR загружает домен приложения, он сначала инициализирует поля c. Таким образом, если ваш код имеет проблемы с полями stati c, исключение будет выдаваться до тех пор, пока не будет указан обработчик Application_Error.

Еще один момент , занимает ли ваше приложение много памяти ? Существует 2 случая, когда приложение не может записывать журналы и выполнять код в блоке catch: StackOverflowException и OutOfMemoryException. Можете ли вы проверить, есть ли у нее утечки памяти или бесконечная рекурсия?

Еще одна точка : установите в настройках визуального изучения, чтобы разрывать при возникновении любого исключения.

Еще один момент : Лучше переместить ваши логики инициализации c из конструкторов stati c в ApplicationStart или что-то в этом роде. Вы можете сделать это временно, чтобы поймать сумку и затем переместить ее в предыдущее состояние.

...