!프로세스

!process 확장은 지정된 프로세스 또는 EPROCESS 블록을 포함한 모든 프로세스에 대한 정보를 표시합니다.

이 확장은 커널 모드 디버깅 중에만 사용할 수 있습니다.

구문

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

매개 변수

/s **** 세션
원하는 프로세스를 소유하는 세션을 지정합니다.

/m **** 모듈
원하는 프로세스를 소유하는 모듈을 지정합니다.

처리
대상 컴퓨터에서 프로세스의 16진수 주소 또는 프로세스 ID를 지정합니다.

프로세스은 !process 확장에 프로세스 주소 또는 프로세스 ID가 표시되는지 여부를 결정합니다. 모든 버전의 Windows에서 프로세스를 생략하면 디버거는 현재 시스템 프로세스에 대한 데이터만 표시합니다. Process가 0이고 ImageName이 생략되면 디버거는 모든 활성 프로세스에 대한 정보를 표시합니다. 현재 프로세스에 대한 프로세스 정보에 대해 -1을 지정하면 표시됩니다.

Flags
표시할 세부 수준을 지정합니다. 플래그 는 다음 비트의 조합일 수 있습니다. 플래그가 0이면 최소한의 정보만 표시됩니다. 기본값은 Windows 버전 및 Process에 따라 달라집니다. 프로세스가 생략되거나 Process가 0 또는 -1인 경우기본값은 0x3, 그렇지 않으면 기본값은 0xF.

비트 0(0x1)
시간 및 우선 순위 통계를 표시합니다.

비트 1(0x2)
프로세스와 연결된 스레드 및 이벤트 목록과 해당 대기 상태를 표시합니다.

비트 2(0x4)
프로세스와 연결된 스레드 목록을 표시합니다. 비트 1(0x2 없이 포함되는 경우 각 스레드는 한 줄에 표시됩니다. 비트 1과 함께 포함되는 경우 각 스레드는 스택 추적과 함께 표시됩니다.

비트 3(0x8)
각 함수에 대한 반환 주소 및 스택 포인터를 표시합니다. 함수 인수 표시가 표시되지 않습니다.

비트 4(0x10)
프로세스 컨텍스트를 이 명령의 기간 동안 지정된 프로세스와 동일하게 설정합니다. 이로 인해 스레드 스택이 보다 정확하게 표시됩니다. 이 플래그는 지정된 프로세스에 .process /p /r을 사용하는 것과 동일하기 때문에 기존의 모든 사용자 모드 모듈 목록은 해제됩니다카드. Process가 0이면 디버거에 모든 프로세스가 표시되고 각 프로세스에 대해 프로세스 컨텍스트가 변경됩니다. 단일 프로세스만 표시하고 해당 사용자 모드 상태가 이미 새로 고쳐진 경우(예: .process /p /r) 이 플래그를 사용할 필요가 없습니다. 이 플래그는 비트 0(0x1)과 함께 사용할 때만 유효합니다.

ImageName
표시할 프로세스의 이름을 지정합니다. 디버거는 실행 가능한 이미지 이름이 ImageName과 일치하는 모든 프로세스를 표시합니다. 이미지 이름은 EPROCESS 블록에서 일치해야 합니다. 일반적으로 파일 확장명(일반적으로 .exe)을 포함하여 프로세스를 시작하기 위해 호출되고 15번째 문자 다음에 잘린 실행 파일 이름입니다. 공백이 포함된 이미지 이름을 지정할 수 있는 방법은 없습니다. ImageName을 지정하면 프로세스는 0이어야 합니다.

DLL

Kdexts.dll

추가 정보

커널 모드의 프로세스에 대한 자세한 내용은 컨텍스트 변경을 참조 하세요. 프로세스 및 스레드 분석에 대한 자세한 내용은 Mark Russinovich 및 David Solomon의 Microsoft Windows Internals를 참조하세요.

설명

다음은 !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라는 단어 뒤의 8자 16진수는 EPROCESS 블록의 주소입니다. 앞의 예제의 마지막 항목에서 프로세스 주소는 0x809258E0.

프로세스 ID(PID)

Cid라는 단어 뒤의 16진수입니다. 이전 예제의 마지막 항목에서 PID는 0x44 또는 10진수 68입니다.

PEB(프로세스 환경 블록)

Peb라는 단어 뒤의 16진수는 프로세스 환경 블록의 주소입니다. 이전 예제의 마지막 항목에서 PEB는 주소 0x7FFDE000 있습니다.

부모 프로세스 PID

ParentCid라는 단어 뒤의 16진수는 부모 프로세스의 PID입니다. 이전 예제의 마지막 항목에서 부모 프로세스 PID는 0x26 또는 10진수 38입니다.

이미지

프로세스를 소유하는 모듈의 이름입니다. 앞의 예제의 마지막 항목에서 소유자는 spoolss.exe. 첫 번째 항목에서 소유자는 운영 체제 자체입니다.

프로세스 개체 주소

ObjectTable 단어 뒤의 16진수입니다. 앞의 예제의 마지막 항목에서 프로세스 개체의 주소는 0x80925c68.

한 프로세스에 대한 전체 세부 정보를 표시하려면 플래그를 7로 설정합니다. 프로세스 주소를 프로세스 주소와 같게 설정하거나 프로세스 ID와 같은 프로세스를 설정하거나 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

프로세스가 만들어진 후 경과된 시간을 나열합니다. 시간:분:초.밀리초 단위로 표시됩니다.

UserTime

프로세스가 사용자 모드에서 실행된 시간을 나열합니다. UserTime 값이 매우 높은 경우 시스템 리소스가 고갈되는 프로세스를 식별할 수 있습니다. 단위는 ElapsedTime의 단위와 동일합니다.

KernelTime

프로세스가 커널 모드에서 실행된 시간을 나열합니다. KernelTime 값이 매우 높은 경우 시스템 리소스가 고갈되는 프로세스를 식별할 수 있습니다. 단위는 ElapsedTime의 단위와 동일합니다.

작업 집합 크기

프로세스의 현재, 최소 및 최대 작업 집합 크기를 페이지에 나열합니다. 매우 큰 작업 집합 크기는 메모리가 누출되거나 시스템 리소스가 고갈되는 프로세스의 징후일 수 있습니다.

QuotaPoolUsage 항목

프로세스에서 사용하는 페이징된 풀과 페이지가 아닌 풀을 나열합니다. 메모리 누수가 있는 시스템에서 모든 프로세스에서 과도한 비페이지 풀 사용량을 검색하면 메모리 누수 프로세스가 있는 프로세스를 알 수 있습니다.

복제

프로세스가 POSIX 또는 Interix 하위 시스템에 의해 만들어졌는지 여부를 나타냅니다.

프라이빗

프로세스에서 현재 사용 중인 프라이빗(공유 불가능한) 페이지 수를 나타냅니다. 여기에는 페이징된 메모리와 페이징된 메모리가 모두 포함됩니다.

프로세스 목록 정보 외에도 스레드 정보에는 스레드에 잠금이 있는 리소스 목록이 포함됩니다. 이 정보는 스레드 헤더 뒤의 세 번째 출력 줄에 나열됩니다. 이 예제에서 스레드에는 주소가 80144fc0인 SynchronizationEvent라는 하나의 리소스에 대한 잠금이 있습니다. 이 주소를 !kdext*.locks 확장에 표시된 잠금 목록과 비교하여 리소스에 대한 배타적 잠금이 있는 스레드를 확인할 수 있습니다.

!stacks 확장은 모든 스레드의 상태에 대한 간략한 요약을 제공합니다. 특히 리소스 충돌 또는 교착 상태와 같은 다중 스레드 문제를 디버깅할 때 시스템의 빠른 개요를 얻기 위해 !process 확장 대신 사용할 수 있습니다.