2013-08-20 7 views
33

У моего клиента есть приложение ASP.NET, установленное на двух производственных серверах (сбалансированное с NLB, но это не имеет значения). Оба сервера аварии каждые 3-4 часа при следующем просмотре событий регистрируется ошибка:Как отладить ошибку w3wp clr.dll

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2
Faulting module name: clr.dll, version: 4.0.30319.18034, time stamp: 0x50b5a783
Exception code: 0xc00000fd Fault offset: 0x000000000001a840
Faulting process id: 0xd50
Faulting application start time: 0x01ce97fe076d27b4
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Report Id: e0c90a5f-0455-11e3-8f0e-005056891553

Я понятия не имею, как отлаживать или с чего начать. Когда произойдет сбой, серверное использование процессора скачкообразно переместится на 100% и останется там. Процесс вины w3wp.exe. Я даже не уверен, генерирует ли мой код ошибку или нет. Это IIS 7.5. Любые указатели будут очень благодарны.

ответ

56

Похоже, что у вас есть исключение StackOverflow, которое вызвано неограниченной рекурсией (функция, вызывающая себя и т. Д.). Это невозможно поймать обычным блоком try/catch. Вы можете отследить проблему с помощью DebugDiag и WinDbg.

DebugDiag может быть настроен на создание дампа сбоя при возникновении исключения StackOverflowException. Загрузите по адресу https://www.microsoft.com/en-us/download/details.aspx?id=49924.

  1. Открыть DebugDiag и нажать Добавить правило.
  2. «Crash» должен быть выбран. Нажмите "Далее.
  3. Выберите «Конкретный пул приложений IIS» и нажмите «Далее».
  4. Выберите пул приложений и нажмите «Далее».
  5. Вы должны находиться в окне расширенной конфигурации. Нажмите «Исключения» в разделе «Дополнительные настройки».
  6. Нажмите «Добавить исключение» и выберите «Переполнение стека» с типом действия полного пользователя.
  7. Нажмите «ОК» и сохраните и закройте.

В следующий раз, когда возникло возникновение StackOverflowException, у вас будет аварийный свал. Теперь нужно интерпретировать файл дампа.

Средства отладки для Windows являются частью SDK Windows и могут быть загружены по адресу http://msdn.microsoft.com/en-US/windows/hardware/gg463009/.

  1. Чтобы использовать WinDbg, вам необходимо получить файлы символов. Download the symbol files и поместите их в локальную папку.
  2. Открыть WinDbg. В меню «Файл» выберите «Путь к символьному файлу».
  3. В поле «Путь к символу» в документации говорится ввести следующую команду: SRV*your local folder for symbols*http://msdl.microsoft.com/download/symbols, однако я просто поместил в локальную папку символы, и она отлично работала.
  4. Выйдите и снова откройте WinDbg и откройте Crash Dump и найдите файл дампа, созданный DebugDiag.
  5. В командной строке введите .loadby sos clr
  6. Теперь напечатайте !CLRStack

В результатах, должно быть ясно, что проблема (вы, вероятно, увидите кучу линий, показывающих функцию (s) который неоднократно вызывался).

+0

Связанный вопрос: http://stackoverflow.com/questions/6019674/how-to-debug-crashed-dump-file – MikeSmithDev

+0

Я пробовал это, поймал дамп, получил некоторые отладочные символы, и теперь у меня есть следующая ошибка, когда загрузка дампа: '*** ОШИБКА: Файл символа не найден. По умолчанию экспортируются символы для ntdll.dll - В этом файле дампа есть исключение из интереса, хранящегося в нем. Доступ к хранимой информации об исключении можно получить через .ecxr. ... *** ОШИБКА: Файл символа не найден. По умолчанию для экспорта символов для clr.dll - *** ВНИМАНИЕ: Не удалось проверить контрольную сумму для mscorlib.ni.dll *** ОШИБКА: загрузка модуля завершена, но символы не могут быть загружены для mscorlib.ni.dll' – cristi71000

+0

OOps, мой плохой, теперь я загрузил дамп без ошибок, но когда я делаю «CLRStack», он говорит «Не удалось загрузить DLL для доступа к данным» – cristi71000

1

Некоторое дополнение к вышеуказанному ответу. Развернуть расширение проводника, которое получило ошибку при входе пользователя.Таким образом, для пользователя он выглядит «мигающий экран» (в то время как проводник пытается запустить и сбой, затем перезапустить и т. Д.). Записано под другой учетной записью пользователя DebugDiag и WinDbg. Я использую Windows 8.1 с .Net 4.0 со всеми последними обновлениями сегодня (13 января 2014 года) Пробовал загружать несколько символов локально, но WinDbg не может загружать clr.pdb из-за неправильной signaure.

Решите, используя символы онлайн - используйте «SRV * http://msdl.microsoft.com/download/symbols» в качестве символа пути.

0

Другая причина может «бесконечно рекурсивно функционировать». Когда происходит infinine loop Windows, попытайтесь устранить тупик и отключите выпущенный пул приложений.

Я встречался с таким же вопросом сегодня. У меня есть рекурсивная функция, которая перечисляет проект parent-project-sub. Один проект ставит сам родительский проект, и когда возвращающая функция пытается перечислить весь родительский проект, происходит бесконечный цикл.

0

Я был в состоянии проверить Просмотр событий -> Журналы Windows -> Система и найти

Application pool 'DankAppPool' is being automatically disabled due to a series of failures in the process(es) serving that application pool.

Ниже, что:

A process serving application pool 'DankAppPool' suffered a fatal communication error with the Windows Process Activation Service. The process id was '5704'. The data field contains the error number.

И:

The QueueMonitor service terminated unexpectedly. It has done this 32 time(s). The following corrective action will be taken in 60000 milliseconds: Restart the service.

По крайней мере QueueMonitor сервис - это место для начала.

Смежные вопросы