Какое-то время я получаю прерывистый сбой SVCHOST.EXE при загрузке в Windows XP. Поскольку он прерывистый, я не могу его надежно воспроизвести и не могу сузить, когда он запущен, и, поскольку это SVCHOST , я не могу определить, какая служба вызывает сбой, потому что диалог создается CSRSS.EXE , а не экземплярами. SVCHOST.EXE .

Одна вещь, которую я точно знаю, это то, что если я закрываю нижеприведенное диалоговое окно, которое появляется, когда это происходит, то вся система полностью зависает, но если я оставляю диалоговое окно в покое, я могу продолжать работать и использовать ОС как обычно, однако при При закрытии (в это время диалог неизбежно закрывается) система зависает, что приводит к необходимому сбросу.

Я воспользовался предложением Anonymous Coward о настройке каждого сервиса на использование своего собственного экземпляра SVCHOST вместо общего и обнаружил, к моему удивлению, что процесс сбоя не был одним из экземпляров SVCHOST . Это был CSRSS.EXE .

Теперь мне остается выяснить, почему иногда происходит сбой CSRSS (подавляющее большинство запросов, включающих имена файлов, просто возвращают эти бесполезные страницы базового анализа), но я не уверен, как отладить такую неотъемлемую часть системы, если не считать грязный отладчик ядра. (Я укажу, что система не BSOD, поэтому дамп не генерируется.)

Одна вещь не в том, что адреса кажутся всегда одинаковыми. Это происходило около десятка раз или около того, и ошибочная инструкция всегда находится в 0x76dea383 которая пытается прочитать память в 0x00000000 . Очевидно, что целевой адрес памяти бесполезен, но я уверен, что должен быть способ как-то использовать исходный адрес.

Когда это происходит, я пытался закрыть все процессы и остановить все возможные службы. К сожалению, это не помогает сузить причину, потому что диалоговое окно остается отображаемым, потому что оно создано csrss которое не может быть остановлено без полного удаления всей ОС.


Старая информация:

Я попытался выяснить, какая служба отвечает без успеха. Например, в прошлый раз, когда это произошло, я остановил все возможные службы (и несколько, которые обычно не возможны), закрыл каждое приложение, убил Explorer и, по сути, сократил систему до минимума (было возможно, осталось 10 процессов, используя ~ 111 МБ ОЗУ и 0% ЦП), но он все еще зависал после закрытия диалога. Это заставляет меня подозревать, что это одна из важнейших системных служб, хотя, если бы это было так, то почему система продолжала бы работать в это время?

Кто-нибудь, как я могу отладить это? Например, кто-нибудь может придумать способ определить экземпляр SVCHOST связанный с ошибкой? Я проверил Журнал событий и Обозреватель процессов, но не смог найти ничего, что помогло бы его точно определить. Что я могу сделать с адресом памяти?

(Да, я прогуглил это и нашел множество упоминаний о службе Windows Update, но это не так, потому что WUAUSVC и BITS по умолчанию отключены. И нет, я не могу выполнить метод тестирования « отключить все службы и включить один за другим», потому что, если это одна из важнейших системных служб, Windows вообще не будет работать.)

4 ответа4

3

Это похоже на проблему, которую трудно решить. Вы в основном перечисляете все, что я бы предложил (остановка служб, журнал событий, Process Explorer ...). Единственные дополнительные решения, которые приходят мне в голову - это тяжелые решения, такие как переустановка Windows.

Тем не менее, есть ответ на аналогичный вопрос, который ссылается на Microsoft KB о отладке сбоев SVCHOST с помощью "Средства отладки для Windows", возможно, это может быть полезно.

2

Прежде чем ответить на сообщение об ошибке, найдите идентификатор процесса (PID) в диспетчере задач, затем в командной строке запустите tasklist /svc чтобы узнать, какие службы работают под этим идентификатором процесса (PID). У вас может быть двадцать служб, работающих в одном экземпляре svchost, но вам может повезти, и у вас будет только один или два.

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

2

http://blogs.msdn.com/b/asiatech/archive/2011/08/29/a-useful-tool-to-generate-dump-file-for-a-particular-service.aspx

Есть несколько способов сбросить конкретный сервис:

  1. Использовать инструмент диагностики отладки (DebugDiag) 1.2.
  2. Используйте следующий пакетный файл:

    FOR /F "tokens=2 delims=," %%A IN ('tasklist /svc /FI "services eq winmgmt" /NH /FO csv') DO SET PID=%%~A
    adplus.exe -hang -p %PID% -o c:\dumps
    

http://blogs.technet.com/b/askperf/archive/2008/01/11/getting-started-with-svchost-exe-troubleshooting.aspx

Чтобы изолировать эти услуги, есть два разных подхода с очень тонкими различиями. Первый метод заключается в создании изолированного процесса, который выполняется в той же группе SVCHOST, что и раньше, но не в общем процессе. Второй способ - создать совершенно отдельную группу SVCHOST. Поскольку мы использовали Обновления Windows в качестве нашего примера, давайте продолжим с этим.

Метод 1: Создание изолированного процесса

На самом деле этот метод изменяет один из параметров реестра для рассматриваемой службы с общего процесса на изолированный процесс. Синтаксис команды довольно прост и использует набор команд sc config:

sc config <service name> type=own

Таким образом, для обновлений Windows (wuauserv) команда будет выглядеть так:

sc config wuauserv type= own

Обратите внимание, что между «=» и «собственным» есть пробел - вы должны вставить этот пробел. За кулисами происходит следующее: значение HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv\Type изменяется с 0x20 (что обозначает общий процесс) на 0x10 (что указывает на то, что он имеет свой собственный процесс). Подробнее об этих конкретных значениях можно прочитать в статье MSDN о структуре SERVICE_STATUS_PROCESS. Чтобы завершить изменение, вам нужно остановить и перезапустить службу. Чтобы вернуть эту службу обратно в общую службу, выполните следующую команду: sc config wuauserv type = share. Для этого изменения необходимо перезагрузить саму машину. Никакие другие параметры не изменяются в отношении этой службы, однако, если вы измените тип на изолированный, перезапустите службу и затем запустите команду tasklist, чтобы получить список служб, вы заметите, что существует процесс SVCHOST.EXE, который только содержит службу Windows Update.

Способ 2: создание изолированной группы услуг

Этот метод немного сложнее и включает непосредственное редактирование реестра. Пожалуйста, не забудьте сделать резервную копию реестра, прежде чем вносить какие-либо изменения! Процесс ниже:

  1. Создайте новое значение REG_MULTI_SZ с именем WindowsUpdates в ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost .

  2. Добавьте название сервиса (в данном случае wuauserv) к значению. Вам также необходимо удалить wuauserv из списка в значении HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\Netsvcs для предотвращения конфликтов.

  3. Теперь перейдите к ключу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv и измените значение ImagePath с %systemroot%\system32\svchost.exe -k netsvcs на: %systemroot%\system32\svchost.exe -k WindowsUpdates

  4. Перезапустите службу автоматического обновления, и вы должны увидеть новый экземпляр SVCHOST.EXE, который содержит только службу автоматического обновления.

  5. Этот метод может быть повторен, чтобы выделить несколько служб в свои собственные группы.

  6. Чтобы вернуться к исходным конфигурациям, выполните действия, описанные выше, и перезапустите машину. Используйте резервную копию реестра, чтобы убедиться, что вы вернули нужные службы в соответствующие группы.

Дополнительным усовершенствованием этого метода было бы создание копий файла SVCHOST.EXE с соответствующим именем для изолированной службы - например, скопировать %systemroot%\system32\svchost.exe в новый файл с именем %systemroot%\system32\svchost_wuauserv.exe , Помните, что вам нужно будет внести соответствующие изменения в значение ImagePath в реестре, которые отражают имя исполняемого файла. Настраивая исполняемый файл, вы можете использовать такие инструменты, как Debug Diagnostic Toolkit, который мы рассматривали в предыдущем посте, для мониторинга определенных служб на предмет сбоев. Вы также можете быстро определить, какие службы работают неправильно в диспетчере задач, а также получить имя сбойного исполняемого файла, зарегистрированного в средстве просмотра событий в случае сбоя этой службы.

1

Шаги по устранению неполадок

Ну, я сузил это настолько, насколько это возможно (опять же, не прибегая к отладке ядра):

  1. Я исследовал оснастку « Службы» (services.msc) сразу после чистой загрузки, чтобы составить список всех служб, которые запускаются во время обычной загрузки (у меня уже есть ее минимум, так что это, безусловно, помогает)
  2. Как предложил Anonymous Coward, я настроил каждую службу, которая работает в своем собственном процессе
  3. В следующий раз я запустил Process Explorer и просмотрел загруженные изображения (Properties->Threads) в CSRSS.exe
    1. Составил список тем и их файлов изображений
    2. Свалил стек каждого
  4. В следующий раз, когда это произошло, я наблюдал момент, когда это происходит, и что происходило в этот момент, а также изменения на экране.


наблюдения

Это был список изображений, запущенных в процессе CSRSS с шага 3.1:
winsrv.dll
csrsrv.dll
ati2mtag.sys

На шаге 4 я заметил, что как только всплыло диалоговое окно с сообщением об ошибке, исчезли некоторые значки в трее, в частности, значок из ATI Tray Tools, указывающий температуру моей видеокарты.


Результаты

И вот оно!

В тот момент, когда появляется диалоговое окно с сообщением об ошибке, происходит сбой ATI Tray Tools. (Как я не заметил этого раньше? Тем более, что я часто использую горячие клавиши для регулировки яркости экрана.) Это идет рука об руку с тем фактом, что ATI2MTAG появляется в списке потоков в нарушающем процессе, а также в регулярной и повторяющейся записи системного журнала о том, что \SystemRoot\System32\ativvaxx.dll failed to load.


Резюме / Решение

Если кто-то еще сталкивается с подобной проблемой и находит здесь путь , проблема заключается в видео драйвере ATI. Если вы не можете обновить оборудование, возможно, обновление до последнего пакета обновления для Windows может исправить это. (Теперь мне просто нужно перевести все соответствующие сервисы обратно в режим общего процесса - где эта резервная копия .REG файл…)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .