Процессы, выходящие из-под контроля, являются распространенной причиной проблем с компьютером. Но решение этих проблем требует не просто остановки неисправного процесса — нужно найти причину неполадок. Два бесплатных инструмента от Microsoft — Process Explorer и Adplus — могут помочь выявить неисправности и решить проблемы быстрее, указав, какие именно компоненты процесса потребляют больше всего ресурсов

не, как инженеру по поддержке в Microsoft, пользователи часто сообщают о процессах, выходящих из-под контроля, которые вызывают проблемы с производительностью компьютера. Вероятно, многие знают, что такое вышедший из-под контроля процесс. Такой процесс загружает один или более процессоров, что делает систему пассивной и иногда приводит к тому, что другие приложения затормаживаются или завершают работу со сбоем. Нередко удается быстро обнаружить эти проблемы, используя Task Manager для просмотра информации о текущих процессах. Распространенный способ избежать последствий выхода процесса из-под контроля — просто прекратить его выполнение, но это временная мера. Если снова запустить процесс, все повторится.

Чтобы действительно решить проблему, нужно обратиться к службе поддержки производителей приложения. Однако, прежде чем позвонить туда, можно попытаться кое-что предпринять.

Два инструмента для диагностики неисправностей

Для диагностики процессов, которые потребляют значительное количество рабочих циклов процессора, мы используем два инструмента: Process Explorer и Adplus. Каждый из них имеет свои преимущества. Process Explorer доступен на сайте live.sysinternals.com. Это самый удобный инструмент, который мы используем, если получаем сигналы о выходе процесса из-под контроля, а у вас есть либо удаленный, либо физический доступ к системе. Adplus — это сценарный файл, он входит в состав набора средств отладки Debugging Tools for Windows (www.microsoft.com/whdc/devtools/debugging/default.mspx). Данный инструмент стоит выбрать, если вы не знаете, когда процесс начнет выходить из-под контроля, и у вас может не оказаться под рукой консоли доступа, когда это случится.

Использование Process Explorer

Здесь описан случай из практики Microsoft Escalation Services. Недавно мы столкнулись с ситуацией, когда процесс Windows XP SP2 wmiprvse.exe (отдельный хост-процесс для провайдеров WMI) создавал нагрузку на процессор. Клиент уже использовал Performance Monitor, выбирая счетчик %Processor Time для идентификации процесса wmiprvse.exe, который создавал полную загрузку центрального процессора.

В данном случае мы знали, когда проблема может проявиться, а у клиента был физический доступ к рабочей станции, когда происходило «зависание». Таким образом, нужно было задействовать Process Explorer, чтобы узнать, какие компоненты были вовлечены в работу во время сбоя.

Второй шаг после открытия Process Explorer — задать местоположение символов в Process Explorer. Символы используются для преобразования бинарной информации в читаемый формат. Но, прежде чем указать местоположение символов, убедитесь, что средства отладки Debugging Tools for Windows уже установлены на системе; вы будете использовать часть этого комплекта инструментов для осмотра подозрительного процесса.

Чтобы задать местоположение символов, в Process Explorer нужно щелкнуть мышью на пункте Options, затем на пункте Configure Symbols. Если вы установили отладчики в расположение по умолчанию, диалоговое окно Configure Symbols должно показать путь к символам.

Теперь настало время узнать, какие компоненты в процессе создают помехи процессору. Из списка процессов, показанных в Process Explorer, нужно выбрать процесс, создающий помехи (wmiprvse.exe), и дважды щелкнуть на нем мышью. Появится диалоговое окно Properties этого процесса, которое содержит все потоки, а процесс, потребляющий большую часть ресурсов центрального процессора, будет расположен в самом верху списка. Далее требуется нажать кнопку Stack, чтобы добраться до списка модулей и вызовов функций потока, потребляющего самое большое время процессора. Вы увидите окно, подобное изображенному на экране 1.

Список модулей и вызываемых функций для загружающего систему процесса

На экране 1 показано несколько модулей, и мы можем использовать эту информацию для сужения диапазона поиска компонента (или компонентов), который послужил причиной выхода из-под процесса контроля, и, вероятно, решить проблему, найдя сведения о нем в Internet. Например, я поискал строку Assetadvisor.dll wmiprvse cpu, потому что помеха процессору появилась внутри процесса wmiprvse.exe, а AssetAdvisor.dll был компонентом стека и повторялся несколько раз. В результате я нашел статью TechNet, где рассказывалось о такой неполадке, на сайте support.microsoft.com/kb/937882. Таким образом, выбрав компоненты для поиска, вы, вероятно, легко найдете их, поскольку они находятся на вершине стека потоков и повторяются. Идентификация компонентов, вовлеченных в создание помех, поможет вам самостоятельно исследовать проблему и, возможно, даже избежать звонка в службу поддержки.

Помните, что Process Explorer помог в нашем сценарии в силу соблюдения двух условий:

  • мы знали, когда процесс будет создавать помехи процессору;
  • у нас был доступ к консоли поврежденной системы.

Использование Adplus

Если сценарий в ситуации выхода процесса из-под контроля не попадает ни под одно из этих условий, можно использовать Adplus. Этот инструмент позволяет собрать тот же самый тип информации, что и Process Explorer, но вы можете и не знать, когда процесс будет создавать помехи, или не иметь физического доступа к системе во время неполадок. Я продемонстрирую пример с использованием нашего сценария с wmiprvse.exe. Более подробную информацию об использовании Adplus можно найти в статье Microsoft на сайте support.microsoft.com/kb/286350/en-us.

Adplus — это сценарий vbs, который включается в Debugging Tools for Windows и должен запускаться из каталога, где установлены инструменты отладки, C:program filesDebugging Tools for Windows. Когда вы запустите Adplus, используя правильные параметры командной строки, инструмент будет управлять процессом и создаст дамп-файл, когда процесс будет мешать процессору. Следующая команда делает так, что Adplus начинает управлять процессом wmiprvse.exe и создавать дамп-файлы в каталоге c:dumpfiles:

C:Program FilesDebugging Tools for Windows (x86)> adplus -hang -pn wmiprvse .exe -o c:dumpfiles

Команда здесь разделена на строки, но на практике требуется все вводить одной строкой. Ключ -hang переключает Adplus в режим ожидания Hang, в котором производятся полные дампы памяти для процесса, указанного в командной строке, после того как сценарий закончит работу. Ключ -pn указывает процесс, за которым необходимо следить. Ключ -o, сопровождаемый папкой местоположения, сообщает Adplus, в какой каталог сохранять дамп-файлы.

После запуска команды Adplus автоматически создает дамп-файлы в указанном каталоге, когда процесс начинает загружать процессор. Если это каталог общего доступа, можно выбрать удаленную рабочую станцию, чтобы посмотреть, создал ли Adplus какие-либо файлы, и просмотреть их, когда вам удобно.

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

  • Запустите windbg.exe из каталога Debugging Tools for Windows. Вы увидите окно, которое показано на экране 2.
  • Выберите из меню File, Open Crash Dump и укажите каталог, содержащий дамп-файлы Adplus.
  • Выберите один из дамп-файлов, созданных Adplus; он будет иметь файловое расширение dmp.
  • В строке Windbg введите runaway. Эта команда выводит поток, потребляющий большее время процессора. В нашем примере это поток 5.
  • Чтобы изменить контекст отладчика для фокусирования на потоке 5, введите команду ~5 s.
  • Теперь запустите команду kv, чтобы получить список модулей и вызовы функций, вовлеченных в процесс, создающий помехи.

Дамп Adplus и его обработка командами отладчика

Результаты команд Windbg, которые вы получили ранее, указывают на тот же модуль, который, как мы обнаружили, был причиной сбоя, когда мы использовали Process Explorer (AssetAdvisor.dll).

Какой бы инструмент вы ни использовали для выявления неполадок, процессы, выходящие из-под контроля, будут зависеть от вашей среды. Process Explorer проще в применении, но он не работает при определенных условиях. Использование Adplus предполагает большее количество шагов, но его можно задействовать, когда Process Explorer не сможет работать; при этом он выдаст ту же самую информацию по поиску неисправностей. В следующий раз, когда выходящий из-под контроля процесс будет загружать вашу систему, попробуйте использовать один или оба инструмента.

Майкл Моралес (morales@microsoft.com) — старший инженер службы поддержки Microsoft Global Escalation Services. Специализируется на сложных проблемах отладки и производительности Windows. В его блоге blogs.msdn.com/ntdebugging можно найти дополнительную информацию по отладке Windows