Как отладить ошибку w3wp clr.dll
Мой клиент имеет приложение ASP.NET, установленное на двух производственных серверах (сбалансированное с NLB, но это не имеет значения).
Оба сервера вылетают каждые 3-4 часа со следующей регистрацией журнала событий:
Неверное имя приложения: w3wp.exe, версия: 7.5.7601.17514, отметка времени: 0x4ce7afa2
Неверное имя модуля: clr.dll, версия: 4.0.30319.18034, отметка времени: 0x50b5a783
Код исключения: 0xc00000fd Смещение ошибки: 0x000000000001a840
Идентификатор процесса отказа: 0xd50
Время сбоя приложения: 0x01ce97fe076d27b4
Ошибка пути приложения: c:\windows\system32\inetsrv\w3wp.exe
Ошибка в пути модуля: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Идентификатор отчета: e0c90a5f-0455-11e3-8f0e-005056891553
Я не знаю, как отлаживать или с чего начать. Когда произойдет сбой, серверное использование процессора скачкообразно переместится на 100% и останется там. Процесс вины w3wp.exe. Я даже не уверен, генерирует ли мой код ошибку или нет. Это IIS 7.5. Любые указатели будут очень благодарны.
Ответы
Ответ 1
Похоже, что у вас есть исключение StackOverflow Exception, вызванное неограниченной рекурсией (функция, которая повторно вызывает себя и т.д.). Это невозможно поймать обычным блоком try/catch. Вы можете отследить проблему с помощью DebugDiag и WinDbg.
DebugDiag может быть настроен на создание дампа сбоя при возникновении исключения StackOverflowException. Загрузите https://www.microsoft.com/en-us/download/details.aspx?id=49924.
- Откройте DebugDiag и нажмите "Добавить правило".
- "Crash" должен быть выбран. Нажмите "Далее" .
- Выберите "Конкретный пул веб-приложений IIS" и нажмите "Далее" .
- Выберите пул приложений и нажмите "Далее" .
- Вы должны находиться в окне расширенной конфигурации. Нажмите "Исключения" в разделе "Дополнительные настройки".
- Нажмите "Добавить исключение" и выберите "Переполнение стека" с типом действия "Полный пользовательский доступ"
- Нажмите "ОК" и сохраните и закройте.
В следующий раз, когда произойдет StackOverflowException, у вас будет сбой аварийной ситуации. Теперь нужно интерпретировать файл дампа.
Средства отладки для Windows являются частью SDK Windows и могут быть загружены в http://msdn.microsoft.com/en-US/windows/hardware/gg463009/.
- Чтобы использовать WinDbg, вам нужно получить файлы символов. Загрузите файлы символов и поместите их в локальную папку.
- Откройте WinDbg. В меню "Файл" выберите "Путь к символьному файлу".
- В поле "Путь к символу" в документации говорится ввести следующую команду:
SRV*your local folder for symbols*http://msdl.microsoft.com/download/symbols
, однако я просто поместил в локальную папку символы и работал нормально.
- Выйдите из и снова запустите WinDbg и откройте Crash Dump и найдите файл дампа, созданный DebugDiag.
- В командной строке введите
.loadby sos clr
- Теперь введите
!CLRStack
В результатах должно быть ясно, в чем проблема (вы, скорее всего, увидите BUNCH строк, показывающих функции, которые неоднократно вызывались).
Ответ 2
Некоторое дополнение к вышеприведенному ответу.
Разверните расширение проводника, которое получило ошибку при входе пользователя в систему. Таким образом, для пользователя он выглядит "мигающий экран" (в то время как проводник пытается запустить и сбой, затем перезапустить и т.д.).
Вход в систему под другой учетной записью пользователя установлен DebugDiag и WinDbg.
Я использую Windows 8.1 с .Net 4.0 со всеми последними обновлениями на сегодня (13 января 2014 года)
Пробовал загружать несколько символов локально, но WinDbg не может загружать clr.pdb из-за неправильной signaure.
Решив его с помощью символов онлайн, используйте "SRV * http://msdl.microsoft.com/download/symbols" как путь к символам.
Ответ 3
Другая причина может "бесконечно рекурсивно функционировать". Когда происходит infinine loop Windows, попытайтесь устранить тупик и отключите освобожденный пул приложений.
Сегодня я встретил такую же проблему. У меня есть рекурсивная функция, которая перечисляет проект parent-project-sub. Один проект настроен на собственный родительский проект, и когда возвращающая функция пытается перечислить весь проект-родительский субподряд, происходит бесконечный цикл.
Ответ 4
Мне удалось проверить Event Viewer → Windows Logs → System и найти
Пул приложений "DankAppPool" автоматически отключается из-за ряд сбоев в процессе (процессах), обслуживающих этот пул приложений.
Ниже:
Пул приложений, обслуживающий процесс "DankAppPool", подвергся смертельному исходу сообщение об ошибке с помощью службы активации Windows. Идентификатор процесса был "5704". Поле данных содержит номер ошибки.
и
Служба QueueMonitor неожиданно прекратилась. Он сделал это 32 Время (ы). Следующие корректирующие действия будут предприняты в 60000 миллисекунды: перезапустите службу.
По крайней мере, служба QueueMonitor - это место для запуска.