!프로세스
!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 확장 대신 사용할 수 있습니다.