#asp.net #.net #debugging #windbg
Вопрос:
Извините, я не смог придумать, как лучше сформулировать свой настоящий вопрос.
Я управляю интенсивным движением ASP.NET сайт на 64-разрядной машине. Однако у меня IIS работает в 32-разрядном режиме из-за некоторых устаревших компонентов приложения. Я запускаю это конкретное веб-приложение в пуле приложений, в котором включена опция «Веб-сад» (запуск 6 процессов на 8-ядерном компьютере).
Один или два раза в неделю один из процессов будет ускоряться до 100% загрузки процессора, что приведет к гигантскому замедлению работы сайта, поэтому мой план состоял в том, чтобы дождаться, пока это произойдет, сбросить память нарушающего процесса, а затем обнулить поток WinDbg, чтобы посмотреть, где код крутится.
Я уже отлаживал с помощью WinDbg раньше, чтобы выяснить, что вызвало тупик на сайте, но это было несколько месяцев назад, и я не могу вспомнить, как я заставил его работать. (В качестве примечания, это урок для документирования всего, что вы делаете.)
Я запускаю WinDbg на сервере Windows 2003, на котором запущен сайт, чтобы предотвратить любые проблемы с версиями DLL. Вот мои шаги до сих пор, пожалуйста, дайте мне знать, где я ошибаюсь, чтобы получить сообщение об ошибке, которое я получаю.
- Я сначала дамп памяти для процесса загрузки с помощью UserDump со следующей командой, где 3389-идентификатор процесса:
userdump -k 3389
- Я загружаю дамп в x86-версию WinDbg.
- Поскольку я использую 32-разрядную версию на 64-разрядной машине, я сначала загружаю дамп памяти, а затем:
.load wow64exts
.effmach x86
- Я удостоверяюсь, что мой путь к символу включает каталог, содержащий файлы PDB моих приложений:
.sympath c:inetpubmyappbin
- Запуск просто `.load SOS’ завершается ошибкой «Система не может найти указанный файл», поэтому я иду по полностью определенному маршруту следующего, который работает:
.load c:windowsmicrosoft.netframeworkv2.0.50727sos
Отсюда я заблудился. Я пробую любую из команд SOS, например !threads
, только для того, чтобы получить эту ошибку:
Failed to load data access DLL, 0x80004005
Эта ошибка также сопровождается пронумерованным списком элементов, которые я должен проверить.
Я проверил, что я запускаю самую последнюю версию отладчика, mscordacwks.dll фактически находится в том же каталоге, что и mscorwks.dll файл, и я выполняю отладку на той же архитектуре, что и файл дампа.
Я также запустил магическую .cordll -ve -u -l
команду»», но это ничего не решает. Меня всегда приветствуют» CLR DLL status: No load attempts
«, когда я это выполняю. Затем я пробую « .reload
«, что дает несколько предупреждений, таких как « WARNING: wldap32 overlaps dnsapi
«. Я бы хотел, чтобы там было написано что-то вроде « CLRDLL: Loaded DLL C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscordacwks.dll
«. Но это не так.
Комментарии:
1. Симптом, который вы описываете, звучит как коллекция GC2.
2. Вы заглядывали в блог Тесс?: это золотая жила информации.
Ответ №1:
Попробуйте выполнить !sw перед выполнением команд sos. Смотрите это сообщение в блоге.
Комментарии:
1. Я думаю, что !sw просто переключается между 32-разрядным и 64-разрядным режимами, что, по сути, то же самое,
.effmach x86
что и . Я все равно попробовал, но это не помогло. Хотя спасибо, что дал мне что-то попробовать.
Ответ №2:
Ответ №3:
По моему опыту, увеличение пула приложений может быть связано с его переработкой. Вы пробовали агент сбоя / зависания IIS и дамп IIS ?
Также к ним прилагается анализатор файлов дампа, который расскажет вам об утечках памяти и даже предложит области вашего кода, которые нуждаются в исправлении (в комплекте со ссылками на соответствующие статьи MSKB!)
Ответ №4:
Чувак — не уверен, что это поможет, но, может быть, попробуешь вот это.
- Копия c:windowsmicrosoft.netframeworkv2.0.50727sos.dll в тот же каталог, в который установлен windbg (например. c:program файлыСредства отладки для Windows ). Почему? облегчите загрузку файла sos
- запустить windbg
- загрузите файл дампа памяти. для меня я использую ctrl-D или Файл -> открыть аварийный дамп
- .загрузить sos
- .symfix c:tempdebug_symbols
- .перезагрузите
Хорошо.. обратите внимание на командную строку. это говорит мне о текущем потоке, в котором находился дамп. Это может быть бесполезно для сценария с ВЫСОКИМ уровнем процессора .. потому что мы можем быть в любой ниточке.
поэтому отсюда я смотрю на запущенные потоки и проверяю самый загруженный поток
8 !пул потоков
9 !сбежавший
0:027 !runaway
User Mode Time
Thread Time
18:704 0 days 0:00:17.843 <-- Thread #18
19:9f4 0 days 0:00:13.328 <-- Thread #19
16:1948 0 days 0:00:10.718
26:a7c 0 days 0:00:01.375
24:114 0 days 0:00:01.093
27:d54 0 days 0:00:00.390
28:1b70 0 days 0:00:00.328
0:b7c 0 days 0:00:00.171
25:3f8 0 days 0:00:00.000
23:1968 0 days 0:00:00.000
нити 18 и 19 уже некоторое время болтаются … хм… они застряли в петле?
- ~18 лет
- !clrstack. это похоже на отладку в Windows.
.. и отсюда вы можете сбрасывать объекты и прочее, указывая ссылки на адреса и прочее.
зацени !помогите перечислить некоторые команды, которые нужно попробовать использовать .. я думаю !help.sos тоже работает?
ХТ … если вы все еще застряли, спросите, что сработало, а что нет.
Ответ №5:
Мне просто пришлось столкнуться с подобной проблемой. В моем случае оказалось, что WinDbg не смог найти правильную версию mscorwks.dll. В дополнение к версии фреймворка, существует также версия библиотеки DLL, которая может отличаться между одной и той же версией фреймворка.
Теоретически серверы символов Microsoft должны иметь возможность предоставлять необходимые библиотеки DLL, но для меня этого не происходило. Чтобы решить эту проблему, я использовал !sym noisy
дополнительную информацию о загрузке символов. Когда я это сделал !dumpstack
, я получил сообщение об ошибке:
SYMSRV: http://msdl.microsoft.com/download/symbols/mscorwks.dll/492B82C1590000/mscorwks.dll not found
Чтобы исправить это, я создал соответствующие папки в своем локальном кэше символов и скопировал mscorwks.dll от машины, из которой произошла свалка. После a .reload
WinDbg нашел необходимую библиотеку DLL в локальном кэше символов и счастливо продолжил.
Кроме того, вы можете найти точную версию mscorwks, с которой используется lm v m mscorwks
. Затем вы можете найти обновление, содержащее нужную вам версию, из этого списка. Вам нужно будет извлечь необходимые библиотеки DLL из конкретного обновления в нужное место.