!過程
!process 延伸模組會顯示指定進程的相關信息,或所有進程的相關信息,包括 EPROCESS 區塊。
此擴充功能只能在內核模式偵錯期間使用。
語法
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
參數
/s **** 工作階段
指定擁有所需進程的工作階段。
/m **** 模組
指定擁有所需進程的模組。
過程
指定目標電腦上的進程十六進位位址或進程標識碼。
Process 的值 會決定 !process 延伸模組是否顯示行程位址或進程識別碼 。 如果 在任何版本的 Windows 中省略 Process ,調試程式只會顯示目前系統進程的相關數據。 如果 Process 為 0 且 省略 ImageName ,調試程式會顯示所有使用中進程的相關信息。 如果已針對 目前進程的進程 資訊指定 -1,則會顯示。
旗標
指定要顯示的詳細數據層級。 旗標 可以是下列位的任何組合。 如果 Flags 為 0,則只會顯示最少的資訊量。 默認值會根據 Windows 版本和 Process 的值而有所不同。 如果省略 Process 或 Process 是 0 或 -1,則預設值為0x3;否則,預設值為 0xF。
位 0 (0x1)
顯示時間和優先順序統計數據。
位 1 (0x2)
顯示與進程相關聯的線程和事件清單及其等候狀態。
位 2 (0x4)
顯示與進程相關聯的線程清單。 如果不包含位 1 (0x2),則每個線程都會顯示在單一行上。 如果這與位 1 一起包含,則每個線程都會以堆疊追蹤來顯示。
位 3 (0x8)
顯示每個函式的傳回位址和堆疊指標:隱藏函式自變數的顯示。
位 4 (0x10)
在此命令的持續時間內,將進程內容設定為等於指定的進程。 這會產生更精確的線程堆疊顯示。 由於此旗標相當於針對指定的進程使用 .process /p /r ,因此將會捨棄任何現有的使用者模式模塊清單。 如果 Process 為零,調試程式會顯示所有進程,而且每個進程的內容都會變更。 如果您只顯示單一進程及其使用者模式狀態已重新整理(例如,使用 .process /p/r),就不需要使用此旗標。 只有在搭配 Bit 0 使用時,此旗標才有效(0x1)。
ImageName
指定要顯示的進程名稱。 調試程式會顯示可執行檔映像名稱符合 ImageName 的所有進程。 映像名稱必須符合 EPROCESS 區塊中的該名稱。 一般而言,這是叫用以啟動進程的可執行文件名稱,包括擴展名(通常是.exe),並在第十五個字元之後截斷。 無法指定包含空格的映像名稱。 指定 ImageName 時,Process 必須是零。
DLL
Kdexts.dll
其他資訊
如需核心模式中進程的相關信息,請參閱 變更內容。 如需分析進程和線程的詳細資訊,請參閱 Mark Russinovich 和 David 所羅門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 字後面的十六進位數位。 在上述範例的最後一個專案中,PID 會0x44或十進位 68。 |
進程環境區塊 (PEB) |
Peb 字之後的十六進位數位是進程環境區塊的位址。 在上述範例的最後一個專案中,PEB 位於位址0x7FFDE000。 |
父進程 PID |
ParentCid 一字之後的十六進位數位是父進程的 PID。 在上述範例的最後一個專案中,父進程 PID 會0x26或十進位 38。 |
映像 |
擁有進程的模組名稱。 在上述範例的最後一個專案中,擁有者會spoolss.exe。 在第一個專案中,擁有者是操作系統本身。 |
Process 物件位址 |
ObjectTable 一字後面的十六進位數位。 在上述範例的最後一個專案中,進程對象的位址會0x80925c68。 |
若要顯示一個程式的完整詳細數據,請將 [旗標] 設定為 7。 您可以藉由將 Process 設定為等於進程位址、將 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 |
列出建立程序之後經過的時間量。 這會以小時:分鐘:秒.毫秒為單位顯示。 |
UserTime |
列出進程在使用者模式中執行的時間量。 如果 UserTime 的值異常高,它可能會識別耗用系統資源的程式。 單位與 ElapsedTime 相同。 |
KernelTime |
列出進程在核心模式中執行的時間量。 如果 KernelTime 的值異常高,它可能會識別耗用系統資源的進程。 單位與 ElapsedTime 相同。 |
工作集大小 |
在頁面中列出進程的目前、最小和最大工作集大小。 超大型的工作集大小可能是流失記憶體或耗用系統資源之進程的標誌。 |
QuotaPoolUsage 專案 |
列出進程所使用的分頁和非分頁集區。 在記憶體流失的系統上,尋找所有進程的過度非分頁集區使用量,可以告訴您哪個進程有記憶體流失。 |
複製 |
指出程式是由 POSIX 或 Interix 子系統所建立。 |
私用 |
表示進程目前正在使用的私人(不可共享)頁面數目。 這包括分頁和分頁記憶體。 |
除了進程清單資訊之外,線程資訊還包含線程有鎖定的資源清單。 此資訊列在線程標頭之後的第三行輸出中。 在此範例中,線程有一個資源的鎖定,也就是具有 80144fc0 位址的 SynchronizationEvent。 藉由比較這個位址與 !kdext*.locks 延伸模組所顯示的鎖定清單,您可以判斷哪些線程具有資源的獨佔鎖定。
!stacks 延伸模組提供每個線程狀態的簡短摘要。 這可以用來取代 !process 擴充功能來快速概觀系統,特別是在偵錯多線程問題時,例如資源衝突或死結。