!Процесс

Расширение !process отображает сведения о указанном процессе или обо всех процессах, включая блок EPROCESS.

Это расширение можно использовать только во время отладки в режиме ядра.

Синтаксис

!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName

Параметры

Сеанс /s ****
Указывает сеанс, принадлежащий требуемому процессу.

Модуль /m ****
Указывает модуль, который владеет требуемым процессом.

Обработать
Указывает шестнадцатеричный адрес или идентификатор процесса процесса на целевом компьютере.

Значение процесса определяет, отображается ли расширение !process адрес или идентификатор процесса. Если процесс опущен в любой версии Windows, отладчик отображает данные только о текущем системном процессе. Если параметр Process is 0 и ImageName опущен, отладчик отображает сведения обо всех активных процессах. Если для сведений о текущем процессе отображается значение -1.

Flags
Указывает уровень детализации для отображения. Флаги могут быть любым сочетанием следующих битов. Если флаги равно 0, отображается только минимальное количество сведений. Значение по умолчанию зависит от версии Windows и значения Process. Значение по умолчанию 0x3, если процесс опущен или если процесс равен 0 или -1; в противном случае значение по умолчанию 0xF.

Bit 0 (0x1)
Отображает статистику времени и приоритета.

Бит 1 (0x2)
Отображает список потоков и событий, связанных с процессом, и их состояния ожидания.

Бит 2 (0x4)
Отображает список потоков, связанных с процессом. Если это включается без бита 1 (0x2), каждый поток отображается в одной строке. Если это включается вместе с битом 1, каждый поток отображается с трассировкой стека.

Бит 3 (0x8)
Отображает возвращаемый адрес и указатель стека для каждой функции. Отображение аргументов функции отключается.

Бит 4 (0x10)
Задает контекст процесса, равный указанному процессу в течение этой команды. Это приводит к более точному отображению стека потоков. Так как этот флаг эквивалентен использованию .process /p /r для указанного процесса, любой существующий список модулей пользовательского режима будет отключен карта. Если процесс равен нулю, отладчик отображает все процессы и контекст процесса изменяется для каждого из них. Если вы отображаете только один процесс и его состояние пользовательского режима уже обновлено (например, с .process /p /r), не обязательно использовать этот флаг. Этот флаг действует только при использовании с битом 0 (0x1).

ImageName
Указывает имя отображаемого процесса. Отладчик отображает все процессы, имена исполняемых изображений которых соответствуют ImageName. Имя изображения должно совпадать с именем в блоке EPROCESS. Как правило, это исполняемое имя, которое было вызвано для запуска процесса, включая расширение файла (обычно .exe), и усечено после пятнадцатого символа. Невозможно указать имя изображения, содержащее пробел. При указании ImageName процесс должен быть равен нулю.

DLL-библиотеки

Kdexts.dll

Дополнительная информация

Сведения о процессах в режиме ядра см. в разделе "Изменение контекстов". Дополнительные сведения об анализе процессов и потоков см. в разделе "Внутренние компоненты Microsoft Windows", марк Руссинович и Дэвид Соломон.

Замечания

Ниже приведен пример отображения !process 0 0 :

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 80a02a60  Cid: 0002    Peb: 00000000  ParentCid: 0000
    DirBase: 00006e05  ObjectTable: 80a03788  TableSize: 150.
    Image: System
PROCESS 80986f40  Cid: 0012    Peb: 7ffde000  ParentCid: 0002
    DirBase: 000bd605  ObjectTable: 8098fce8  TableSize:  38.
    Image: smss.exe
PROCESS 80958020  Cid: 001a    Peb: 7ffde000  ParentCid: 0012
    DirBase: 0008b205  ObjectTable: 809782a8  TableSize: 150.
    Image: csrss.exe
PROCESS 80955040  Cid: 0020    Peb: 7ffde000  ParentCid: 0012
    DirBase: 00112005  ObjectTable: 80955ce8  TableSize:  54.
    Image: winlogon.exe
PROCESS 8094fce0  Cid: 0026    Peb: 7ffde000  ParentCid: 0020
    DirBase: 00055005  ObjectTable: 80950cc8  TableSize: 222.
    Image: services.exe
PROCESS 8094c020  Cid: 0029    Peb: 7ffde000  ParentCid: 0020
    DirBase: 000c4605  ObjectTable: 80990fe8  TableSize: 110.
    Image: lsass.exe
PROCESS 809258e0  Cid: 0044    Peb: 7ffde000  ParentCid: 0026
    DirBase: 001e5405  ObjectTable: 80925c68  TableSize:  70.
    Image: SPOOLSS.EXE

В следующей таблице описаны некоторые элементы выходных данных !process 0 0 .

Элемент Значение

Адрес процесса

Шестнадцатеричное число восьми символов после слова PROCESS — адрес блока EPROCESS. В последнем примере в предыдущем примере адрес процесса 0x809258E0.

Идентификатор процесса (PID)

Шестнадцатеричное число после слова Cid. В последнем примере в предыдущем примере идентификатор пин-кода 0x44 или десятичное значение 68.

Блок среды обработки (PEB)

Шестнадцатеричное число после слова Peb — адрес блока среды процесса. В заключительной записи в предыдущем примере PEB находится по адресу 0x7FFDE000.

Родительский процесс PID

Шестнадцатеричное число после слова ParentCid является идентификатором идентификатора родительского процесса. В последнем примере в предыдущем примере родительский процесс PID 0x26 или десятичное значение 38.

Изображения

Имя модуля, которому принадлежит процесс. В последнем примере в предыдущем примере владелец spoolss.exe. В первой записи владелец является самой операционной системой.

Адрес объекта процесса

Шестнадцатеричное число после слова ObjectTable. В последнем примере в предыдущем примере адрес объекта процесса 0x80925c68.

Чтобы отобразить полные сведения об одном процессе, задайте для флагов значение 7. Сам процесс можно указать, установив "Процесс " равным адресу процесса, параметру Process равно идентификатору процесса или параметру ImageName равным имени исполняемого образа. Рассмотрим пример:

kd> !process fb667a00 7
PROCESS fb667a00 Cid: 0002  Peb: 00000000 ParentCid: 0000
  DirBase: 00030000 ObjectTable: e1000f88 TableSize: 112.
  Image: System
  VadRoot fb666388 Clone 0 Private 4. Modified 9850. Locked 0.
  FB667BBC MutantState Signalled OwningThread 0
  Token               e10008f0
  ElapsedTime            15:06:36.0338
  UserTime             0:00:00.0000
  KernelTime            0:00:54.0818
  QuotaPoolUsage[PagedPool]     1480
Working Set Sizes (now,min,max) (3, 50, 345)
  PeakWorkingSetSize        118
  VirtualSize            1 Mb
  PeakVirtualSize          1 Mb
  PageFaultCount          992
  MemoryPriority          BACKGROUND
  BasePriority           8
  CommitCharge           8

    THREAD fb667780 Cid 2.1 Teb: 00000000 Win32Thread: 80144900 WAIT: (WrFreePage) KernelMode Non-Alertable
    80144fc0 SynchronizationEvent
    Not impersonating
    Owning Process fb667a00
    WaitTime (seconds)   32278
    Context Switch Count  787
    UserTime         0:00:00.0000
    KernelTime        0:00:21.0821
    Start Address Phase1Initialization (0x801aab44)
    Initial Sp fb26f000 Current Sp fb26ed00
    Priority 0 BasePriority 0 PriorityDecrement 0 DecrementCount 0

    ChildEBP RetAddr Args to Child
    fb26ed18 80118efc c0502000 804044b0 00000000 KiSwapThread+0xb5
    fb26ed3c 801289d9 80144fc0 00000008 00000000 KeWaitForSingleObject+0x1c2

Обратите внимание, что адрес объекта процесса можно использовать в качестве входных данных для других расширений, таких как !handle, для получения дополнительных сведений.

В следующей таблице описаны некоторые элементы в предыдущем примере.

Элемент Значение
ПОДОЖДИ Скобка после этого заголовка дает причину ожидания. Команда dt nt!_KWAIT_REASON отобразит список всех причин ожидания.

ElapsedTime

Выводит список времени, истекшего с момента создания процесса. Это отображается в единицах часов:Minutes:Seconds.Milliseconds.

UserTime

Выводит список времени выполнения процесса в пользовательском режиме. Если значение UserTime является исключительно высоким, он может определить процесс, который истощает системные ресурсы. Единицы совпадают с единицами elapsedTime.

KernelTime

Выводит список времени выполнения процесса в режиме ядра. Если значение для KernelTime является исключительно высоким, он может определить процесс, который истощает системные ресурсы. Единицы совпадают с единицами elapsedTime.

Размеры рабочих наборов

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

Записи QuotaPoolUsage

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

Клонировать

Указывает, был ли процесс создан подсистемами POSIX или Interix.

Private

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

Помимо сведений о списке процессов, сведения о потоке содержат список ресурсов, на которых блокируются потоки. Эти сведения перечислены в третьей строке выходных данных после заголовка потока. В этом примере поток имеет блокировку для одного ресурса, синхронизацииEvent с адресом 80144fc0. Сравнивая этот адрес со списком блокировок, отображаемых расширением !kdext*.locks , можно определить, какие потоки имеют монопольные блокировки для ресурсов.

Расширение !stacks содержит краткую сводку о состоянии каждого потока. Это можно использовать вместо расширения !process, чтобы получить краткий обзор системы, особенно при отладке многопоточных проблем, таких как конфликты ресурсов или взаимоблокировки.