ZZ:windbg 常用命令

NO IMAGE

ZZ from:http://www.cppblog.com/Walker/archive/2012/06/28/146523.html

不要再假裝自己寫的程式沒bug了,不可能的,debug工具你早晚得用上。最常見的debug工具非printf(windows上用OutputDebugString函式)莫屬,簡單方便易學易用,但侷限性也是顯而易見的,首先它對debugee的影響很大,某些race condition的bug你要多加幾個log它就重現不出來了,然後你把log去了釋出給客戶,結果又成了必現的bug,這種爛事咱們都碰到過,你懂的。其次log能列印的東西有限,有時候你加log追某個變數的值,追到最後發現是其他變數有問題,這時候你又得加log重新跑。最後分析log的過程及其枯燥無聊,而在debug上敲命令分析則充滿了樂趣。我知道有些人對debugger持有鄙視的態度,“單步除錯是程式設計師的恥辱”云云。其實我想說的是,有好工具在手上幹嘛不用,又不會懷孕,怕什麼。

我們今天要來聊聊windbg,windows上debug的神器,(個人感覺)gdb也不如它。不是說windbg本身寫的多麼多麼好,它牛逼的地方在於它是可擴充套件的,windows上的核心開發人員驅動開發人員用了windbg這麼多年,該碰到的問題都碰到過了,該提的需求都提了,該寫的擴充套件也都寫了,導致現在的windbg強大無比,基本啥問題都能解決。就算你的需求很奇葩別人沒想過,你也可以用windbg提供的開發框架自己寫一個擴充套件,不費什麼時間。所以我們看,提供擴充套件功能的工具都會變成神器,瀏覽器如此,debug工具也是一樣。廢話不多說,讓我們來看幾個非常有用的擴充套件:

目錄

!Drvobj

這個命令接收一個driver的名字作為引數,解析名字並找到對應的driver object,然後把由這個驅動程式產生的device object列印出來,如下:

lkd> !drvobj \Driver\usbhub 
Driver object (8999a4f8) is for: 
\Driver\usbhub 
Driver Extension List: (id , addr)

Device Object list: 
89701de8  89a3f330  8974ede8  8977cc98 
8985ac98  89862c98  898b4c98  89add030 
89876c98  89849aa8

 

我們看到,usbhub驅動程式對應的driver object是8999a4f8,由它生成了10個device object。

!Devobj

這個命令接收device object指標作為引數,並列印出該device object的內容,包括當前處理的irp,refrence count,device extension,以及與這個device object相關的上層驅動和下層驅動等,如下

lkd> !devobj 89701de8  
Device object (89701de8) is for: 
USBPDO-9 \Driver\usbhub DriverObject 8999a4f8 
Current Irp 00000000 RefCount 0 Type 00000022 Flags 00003040 
Dacl e16dcf84 DevExt 89701ea0 DevObjExt 89701fd0 DevNode 89998df0 
ExtensionFlags (0000000000)  
AttachedDevice (Upper) 89712b20 \Driver\HidUsb 
Device queue is not busy.


lkd> !devobj 89a3f330  
Device object (89a3f330) is for: 
USBPDO-8 \Driver\usbhub DriverObject 8999a4f8 
Current Irp 00000000 RefCount 0 Type 00000022 Flags 00003040 
Dacl e16dcf84 DevExt 89a3f3e8 DevObjExt 89a3f518 DevNode 899b23c8 
ExtensionFlags (0000000000)  
AttachedDevice (Upper) 8971cb90 \Driver\TcUsb 
Device queue is not busy.

我們檢視了usbhub產生的10個device中的前兩個,可以看出其中有一個是hidusb,另一個是tcusb。順著AttachedDevice列印出的內容我們可以手動遍歷整個驅動棧,不過這看起來有些麻煩,萬幸有人以經寫好一個擴充套件可以幫我們遍歷了,那就是

!devstack

該命令也接收device object作為引數,並遍歷著把該object以下的驅動棧全部列印出來,直到bus driver為止,如下

lkd> !devstack 89a3f330 
  !DevObj   !DrvObj            !DevExt   ObjectName 
  8971cb90  \Driver\TcUsb      8971cc48  000000ae 
> 89a3f330  \Driver\usbhub     89a3f3e8  USBPDO-8 
!DevNode 899b23c8 : 
  DeviceInst is "USB\Vid_0483&Pid_2016\5&39a18bdd&0&2" 
  ServiceName is "TcUsb"

可以看到tc usb在usbhub之上,而usbhub則是硬體"USB\Vid_0483&Pid_2016\5&39a18bdd&0&2“的bus driver。前面有篇博文我們說到過windows裡把幾乎所有的資源都抽象成了一個"object”的概念,所有的object都有一個結構一致的object head,以方便提供統一的操作介面,以下命令就是列印出obect資訊的命令:

!object

kd> !object \ 
Object: e1001300  Type: (8a65e2c0) Directory 
    ObjectHeader: e10012e8 (old version) 
    HandleCount: 0  PointerCount: 39 
    Directory Object: 00000000  Name: \ 
    292 symbolic links snapped through this directory

    Hash Address  Type          Name 
    —- ——-  —-          —- 
     00  e100b6e0 Directory     ArcName 
         8a515030 Device        Ntfs 
     01  e2726b88 Port          SeLsaCommandPort 
     03  e1011488 Key           \REGISTRY 
     05  e2728888 Port          ThemeApiPort 
     06  e16c7f68 Port          XactSrvLpcPort 
     09  e1d4d428 Directory     NLS 
     10  e1001078 SymbolicLink  DosDevices 
     13  e1c9e160 Port          SeRmCommandPort 
     14  8a577030 Device        Dfs…

我們檢視了根目錄,並列出了它的所有子項(太多了,沒全貼上來),它的功能跟winobj很像,不過沒有winobj直觀。再來看幾個跟power有關的命令。我們知道用wdm寫驅動最麻煩的事情之一就是所有的power命令都要自己handle,而wdf則幫我們全包圓了(又回到上會的討論了不是),沒包圓也有它的好處,就是你得強迫自己去理解這部分內容。power irp處理不好,機器很容易就不能進s3/s4或者不能從s3/s4喚醒,這時候我們就得藉助windbg來追查問題到底出在哪兒,檢視當前power狀態的命令是

!podev

該命令接收device object為引數,列印它當前的power狀態

lkd> !podev 89784b10  
Device object is for: 
  DriverObject 899d4410 
Current Irp 00000000 RefCount 0 Type 00000002 DevFlags 00000050 
Device queue is not busy. 
Device Object Extension: 89784bc8: 
PowerFlags: 00000000 =>SystemState=0 DeviceState=0 
Dope: 00000000:

我們看到目前device處於d0(working)狀態,系統處於s0(idle)狀態。但是這個命令只能給我們一個總結,到底哪些power irp正在處理我們沒法看出來。以下命令正是列出系統中所有power irp的

!poreqlist

lkd> !poreqlist 
All active Power Irps from PoRequestPowerIrp 
PopReqestedPowerIrpList 
FieldOffset = 00000004 
Irp 8a60ba20 DevObj 8a5c1d70 \Driver\ACPI Ctx 00000004   Wait Wake S3 
Irp 882f1e00 DevObj 89a05440 \Driver\usbuhci Ctx 00000001   Wait Wake S0 
Irp 883dee00 DevObj 89a2b218 \Driver\usbuhci Ctx 00000001   Wait Wake S0 
Irp 8843c008 DevObj 89a20528 \Driver\usbuhci Ctx 00000001   Wait Wake S0 
Irp 884ca220 DevObj 89a10030 \Driver\usbehci Ctx 00000001   Wait Wake S0 
Irp 883662d0 DevObj 89b36030 \Driver\usbehci Ctx 00000001   Wait Wake S0 
Irp 87ec2008 DevObj 8974ede8 \Driver\usbhub Ctx 00000001   Wait Wake S0 
Irp 89b4ec00 DevObj 899b7618 \Driver\usbuhci Ctx 00000001   Wait Wake S0 
Irp 882ca7d0 DevObj 89a3f330 \Driver\usbhub Ctx 00000001   Wait Wake S0

我們看到很多的hid裝置處於等待喚醒的狀態。

最後我們來聊聊核心除錯時如何除錯使用者態的東西。我們知道在程序的使用者態部分相互隔離,而核心部分都是share同一個地址空間,由這特性帶來的好處壞處我們先不談,今天先關注具體問題。斷在kernel裡的debugger要除錯別的程序的kernel部分很容易,因為地址是同一塊,但是要除錯user mode部分就不那麼容易了。我們知道user mode是不可能直接訪問核心地址的,cpu在將虛地址翻譯成實體地址的時候會檢查特權級,user mode是第3級而核心是第0級,倘若第三級的指令帶的地址是第0級,cpu會拋拒絕訪問的異常。反過來,核心指令訪問user
mode地址雖然可行,不過得考慮程序上下文,如果你不管程序上下文直接訪問user mode地址,有兩種錯誤情況會發生:你訪問的根本不是你想要的程序,或者你訪問的地址根本沒有東西。地址空間分為使用者態和核心態這種說法是站在使用者態角度講的,它假設所有的執行緒都有"使用者態"部分,實際上PsCreateSystemThread產生的核心執行緒是沒有使用者態部分的,它附在一個叫"System”的程序上,而"System”程序只是為管理方便而存在的虛擬的東西,沒有實體。所以我們說從核心debugger除錯使用者態內容遠沒有kernel調kernel,user調user那麼簡單,你必須關心程序上下文這個東西。下面這個命令可以列出系統中所有的程序:

!process

lkd> !process  -1 0 
PROCESS 8854b020  SessionId: 0  Cid: 1060    Peb: 7ffd4000  ParentCid: 04b4 
    DirBase: 0abc0ae0  ObjectTable: e12e5650  HandleCount: 396. 
    Image: windbg.exe

lkd> !process  0 0 
**** NT ACTIVE PROCESS DUMP **** 
PROCESS 881de6f8  SessionId: 0  Cid: 1498    Peb: 7ffde000  ParentCid: 04b4 
    DirBase: 0abc0c20  ObjectTable: e465aa70  HandleCount:  46. 
    Image: notepad.exe

如上所示,當前程序是windbg,process object為8854b020,而我們關心notepad程序的process object是881de6f8 ,並不是同一個,我們首先要做的事情就是切換到notepad這個程序上去,使用內建命令.process

lkd> .process 881de6f8 
Implicit process is now 881de6f8

然後f5讓系統跑一會兒(windbg斷住的時候,整個系統是掛起的,程序切換也不會發生),再次斷下來的時候你就已經在notepad程序裡了(上面列的列印都是在local kernel debug裡的,功能很受限,比如系統沒掛起,f5也不能用。接下來我要切換到雙機除錯模式)

kd> !process -1 0 
PROCESS 863c22f0 SessionId: 0 Cid: 00bc Peb: 7ffdb000 ParentCid: 05fc 
DirBase: 06c602c0 ObjectTable: e16718e8 HandleCount: 29. 
Image: notepad.exe

雖然已經在notepad程序裡了,但user mode的東西依然不可見,因為windbg會快取使用者態的資訊,程序切換後,你得手工重新整理快取,用內建命令.reload /user。做完這一步後,user mode的資訊就變得可見了,你可以在使用者態函式裡下斷點:kd> bp /p @$proc ntdll!ntcreatefile,或者列出載入模組:lm 等等,就跟普通的使用者態程式除錯一摸一樣。上面那一套步驟很煩,卻是步步都不能省,有沒有方法簡化它呢?如開頭所說,windbg是可擴充套件的,你想到的需求,別人早就想到,並且已經寫好工具等你用了,以下命令做完一整套動作:

!bpid

該命令接收process cid作為引數,找到對應的程序並切換程序上下文,跑一會兒,斷下來,重新整理使用者態內容,全部搞定。怎麼樣,是不是很方便?

 

!processfields

!processfields 擴充套件命令顯示執行程序塊(EPROCESS)中欄位的名字和偏移。

語法

!processfields 

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

不可用(檢視註釋)

註釋

該擴充套件命令在Windows XP和之後的系統中都不可用。可以直接使用 dt (Display Type) 命令顯示EPROCESS結構:

kd> dt nt!_EPROCESS 

下面是!processfields 在Windows 2000系統中的示例:

kd> !processfields
 EPROCESS structure offsets:

    Pcb:                               0x0
    ExitStatus:                        0x6c
    LockEvent:                         0x70
    LockCount:                         0x80
    CreateTime:                        0x88
    ExitTime:                          0x90
    LockOwner:                         0x98
    UniqueProcessId:                   0x9c
    ActiveProcessLinks:                0xa0
    QuotaPeakPoolUsage[0]:             0xa8
    QuotaPoolUsage[0]:                 0xb0
    PagefileUsage:                     0xb8
    CommitCharge:                      0xbc
    PeakPagefileUsage:                 0xc0
    PeakVirtualSize:                   0xc4
    VirtualSize:                       0xc8
    Vm:                                0xd0
    DebugPort:                         0x120
    ExceptionPort:                     0x124
    ObjectTable:                       0x128
    Token:                             0x12c
    WorkingSetLock:                    0x130
    WorkingSetPage:                    0x150
    ProcessOutswapEnabled:             0x154
    ProcessOutswapped:                 0x155
    AddressSpaceInitialized:           0x156
    AddressSpaceDeleted:               0x157
    AddressCreationLock:               0x158
    ForkInProgress:                    0x17c
    VmOperation:                       0x180
    VmOperationEvent:                  0x184
    PageDirectoryPte:                  0x1f0
    LastFaultCount:                    0x18c
    VadRoot:                           0x194
    VadHint:                           0x198
    CloneRoot:                         0x19c
    NumberOfPrivatePages:              0x1a0
    NumberOfLockedPages:               0x1a4
    ForkWasSuccessful:                 0x182
    ExitProcessCalled:                 0x1aa
    CreateProcessReported:             0x1ab
    SectionHandle:                     0x1ac
    Peb:                               0x1b0
    SectionBaseAddress:                0x1b4
    QuotaBlock:                        0x1b8
    LastThreadExitStatus:              0x1bc
    WorkingSetWatch:                   0x1c0
    InheritedFromUniqueProcessId:      0x1c8
    GrantedAccess:                     0x1cc
    DefaultHardErrorProcessing         0x1d0
    LdtInformation:                    0x1d4
    VadFreeHint:                       0x1d8
    VdmObjects:                        0x1dc
    DeviceMap:                         0x1e0
    ImageFileName[0]:                  0x1fc
    VmTrimFaultValue:                  0x20c
    Win32Process:                      0x214
    Win32WindowStation:                0x1c4

附加資訊

關於EPROCESS塊的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!psp

!psp 擴充套件用於顯示指定地址處的處理器狀態引數暫存器(processor state parameter (PSP) register)。

該命令僅在Itanium目標機上支援。

語法

!psp Address [DisplayLevel]

引數

Address

指定要顯示的PSP暫存器的16進位制地址。

DisplayLevel

可以是下面這些選項中任意一個:

0

僅顯示PSP欄位的值。這是預設情況。

1

顯示非保留和非忽略的PSP欄位的詳細資訊。

2

顯示所有PSP欄位的詳細資訊,包括被忽略或保留的那些。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

!pte

!pte 擴充套件顯示指定地址的頁表項(page table entry (PTE))和頁目錄項(page directory entry (PDE))。

語法

Windows NT 4.0 和Windows 2000的語法

!pte VirtualAddress 
!pte PTE 
!pte LiteralAddress 
!pte
 StartAddress EndAddress 

Windows XP和之後的語法

!pte VirtualAddress 
!pte PTE 
!pte LiteralAddress 1 

引數

VirtualAddress

指定需要檢視頁表的虛擬地址。

PTE

指定實際的PTE的地址。

LiteralAddress 1

指定實際的PTE或PDE的地址。

StartAddress

(僅x86 或x64 目標機;僅 Windows NT 4.0 和Windows 2000) 指定某個範圍的開始的虛擬地址。該範圍內的所有頁表都會被顯示出來。

EndAddress

(僅x86 或x64 目標機; 僅Windows NT 4.0 和Windows 2000) 指定某個範圍的結束的虛擬地址。該範圍內的所有頁表都會被顯示出來。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

如果指定了一個引數,並且該引數是一個用於儲存頁表的記憶體區域中的地址,那麼偵錯程式將它當作一個PTE引數。該引數被當作要檢視的PTE的實際地址,偵錯程式會顯示該PTE以及相應的PDE。

如果指定的引數不在這個範圍內,偵錯程式把它當作VirtualAddress。會顯示用於對映這個地址的PTE和PDE。

如果指定了兩個引數,並且第二個引數是1 (或者更小的數字),偵錯程式將第一個引數當作LiteralAddress。這個地址會被當作PTE或者PDE的實際地址,並且顯示相應的資料(可能是錯誤的)。

(僅x86 或x64目標機) 如果提供了兩個引數,並且第二個引數比第一個大,偵錯程式將它們當作StartAddress 和EndAddress。命令會顯示指定的記憶體範圍中每個頁面的PTE。

使用!sysptes擴充套件命令檢視所有系統PTE的列表。

下面是x86目標機上的示例:

kd> !pte 801544f4
801544F4  – PDE at C0300800        PTE at C0200550
          contains 0003B163      contains 00154121
        pfn 3b G-DA–KWV    pfn 154 G–A–KRV

輸出的第一行會再次顯示被檢視的虛擬地址。然後是包含該地址記憶體對映(virtual-physical mapping)資訊的PDE和PTE的虛擬地址。

第二行是PDE和PTE的實際內容。

第三行是對這些內容的分析,將它們分解成頁面幀序號(PFN)和狀態位(status bits)。

檢視 !pfn擴充套件命令或者 將虛擬地址轉換成實體地址小節來獲得如何理解和使用PFN的資訊。

在x86和x64目標機上,PDE和PTE的狀態位在下表中列出。!pte 的顯示會用大寫字母或者虛線來表示這些位,並且還新增其他資訊。

設定時的顯示

清除時的顯示

意義

0x200

C

寫時複製(Copy on write)

0x100

G

全域性頁面(Global)

0x80

L

大頁面(Large page)。只有PDE有,PTE中沒有。

0x40

D

髒頁面(Dirty)

0x20

A

已訪問(Accessed)

0x10

N

禁止快取(Cache disabled)

0x8

T

通寫(Write-through)

0x4

U

K

所有者(使用者模式或核心模式)。

0x2

W

R

可寫或者只讀。只有在多處理器計算機和任何執行Windows Vista和之後系統的機器上有。

0x1

V

 

有效位(Valid)

 

E

可執行頁面。對於包括很多x86系統在內的不支援硬體執行/非執行標誌位的平臺,總是顯示E

 

在Itanium目標機上,PDE和PTE的狀態位和PPE中有少許不同。Itanium PPE位有下面這些:

設定時的顯示

清除時的顯示

意義

V

 

有效位(Valid)

U

K

所有者(使用者模式或核心模式)。

D

髒頁面(Dirty)

A

已訪問(Accessed)

W

R

可寫或者只讀。只有在多處理器計算機和任何執行Windows Vista和之後系統的機器上有。

E

執行(Execute)

C

寫時複製(Copy on write)

 

附加資訊

關於頁表、頁目錄和這些狀態位的說明,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!pte2va

!pte2va 擴充套件命令顯示指定的頁表項(PTE)對應的虛擬地址。

語法

!pte2va Address 

Address

指定PTE。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

要檢視指定的PTE的內容,使用!pte命令。

下面是!pte2va 擴充套件的輸出示例:

kd> !pte2va 9230
000800000248c000 

附加資訊

關於頁表和PTE的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!ptov

!ptov擴充套件顯示給定程序的整個實體地址到虛擬地址的對映(physical-to-virtual map)。

語法

!ptov PFN 

引數

PFN

指定程序的頁目錄基址(directory base)的頁面幀序號(PFN)。這和去掉最後三個16進位制數字的頁目錄基地址相同 (即右移12位)。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是一個示例。首先使用!process擴充套件來獲得需要的程序的頁目錄基址:

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
….
PROCESS ff779190  SessionId: 0  Cid: 04fc    Peb: 7ffdf000  ParentCid: 0394
    DirBase: 098fd000  ObjectTable: e1646b30  TableSize:   8.
    Image: MyApp.exe

這裡的頁目錄基址是0x098FD000。去掉末尾的三個0,結果為0x098FD。這就是頁目錄基址的頁面幀序號(PFN)。

將這個數字傳遞給!ptov

kd> !ptov 98fd
7119000 10000
a21a000 20000
6133000 12e000
9de9000 12f000
2b0c000 130000
87cd000 131000
aaf6000 140000
…    …

左邊一列的數字是對映到該程序的每個記憶體頁面的實體地址。右邊一列是它們對映到的虛擬地址。

全部的輸出會非常長。

附加資訊

相關主題,檢視!vtop、 !vpdd、以及 將虛擬地址轉換成實體地址。關於頁表和頁目錄的資訊,檢視Mark
Russinovich 和David Solomon 編寫的Microsoft Windows Internals

WinDbg 文件翻譯—-84

cc682/NetRoc

http://netroc682.spaces.live.com/

!poolfind

!poolfind 擴充套件命令在非分頁和分頁記憶體中查詢指定的pool tag。

語法

Windows NT 4.0中的語法

!poolfind TagString [PoolType

Windows 2000和之後

!poolfind TagString [PoolType
!poolfind TagValue [PoolType

引數

TagString

指定pool tag。TagString 是區分大小寫的ASCII字串。星號(*)可以用來表示任意數量的字元,問號 (?)可以用來代表一個字元。如果沒有使用星號, TagString 必須剛好是4個字元長度。

TagValue

(Windows 2000和之後) 指定pool tag。TagValue 必須以"0x"開頭,即使預設的基數為16。如果該引數以任何其他值開頭(包括"0X"),則會被解釋為ASCII的標籤字串。

PoolType

指定要搜尋的池型別。允許下面這些值:

0

指定非分頁記憶體池。這是預設值。

1

指定分頁記憶體池。

2

指定特殊池(special pool)。

4

(Windows XP和之後) 指定會話池(session pool)。

4, 5, 6

(僅Windows NT 4.0) 和0、1、2一樣,但是顯示詳細資訊。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

該命令根據需要搜尋的池記憶體大小的不同,需要很長時間來執行。要加快速度,可以通過CTRL+A (Toggle Baud Rate) 鍵增加COM埠,或者使用.cache (Set
Cache Size)
 命令增加快取大小 (設定到大約10 MB)。

Pool tag和傳遞給ExAllocateXxx 類例程的標籤一樣。

下面是一個示例。搜尋整個非分頁記憶體池之後搜尋分頁池,但是命令在完成之前被終止(長時間操作之後):

kd> !poolfind SeSd 0

Scanning large pool allocation table for Tag: SeSd (827d1000 : 827e9000)

Searching NonPaged pool (823b1000 : 82800000) for Tag: SeSd

826fa130 size:   c0 previous size:   40  (Allocated) SeSd
82712000 size:   c0 previous size:    0  (Allocated) SeSd
82715940 size:   a0 previous size:   60  (Allocated) SeSd
8271da30 size:   c0 previous size:   10  (Allocated) SeSd
82721c00 size:   10 previous size:   30  (Free)      SeSd
8272b3f0 size:   60 previous size:   30  (Allocated) SeSd
8272d770 size:   60 previous size:   40  (Allocated) SeSd
8272d7d0 size:   a0 previous size:   60  (Allocated) SeSd
8272d960 size:   a0 previous size:   70  (Allocated) SeSd
82736f30 size:   a0 previous size:   10  (Allocated) SeSd
82763840 size:   a0 previous size:   10  (Allocated) SeSd
8278b730 size:  100 previous size:  290  (Allocated) SeSd
8278b830 size:   10 previous size:  100  (Free)      SeSd
82790130 size:   a0 previous size:   20  (Allocated) SeSd
82799180 size:   a0 previous size:   10  (Allocated) SeSd
827c00e0 size:   a0 previous size:   30  (Allocated) SeSd
827c8320 size:   a0 previous size:   60  (Allocated) SeSd
827ca180 size:   a0 previous size:   50  (Allocated) SeSd
827ec140 size:   a0 previous size:   10  (Allocated) SeSd

Searching NonPaged pool (fe7c3000 : ffbe0000) for Tag: SeSd

kd> !poolfind SeSd 1

Scanning large pool allocation table for Tag: SeSd (827d1000 : 827e9000)

Searching Paged pool (e1000000 : e4400000) for Tag: SeSd

e10000b0 size:   d0 previous size:   20  (Allocated) SeSd
e1000260 size:   d0 previous size:   60  (Allocated) SeSd
……
e1221dc0 size:   a0 previous size:   60  (Allocated) SeSd
e1224250 size:   a0 previous size:   30  (Allocated) SeSd

…terminating – searched pool to e1224000
kd> 

附加資訊

關於記憶體池和pool tag的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!poolused

!poolused 擴充套件用於根據每個記憶體池分配的標籤(tag)的使用來顯示記憶體使用摘要。

語法

Windows NT 4.0的語法:

!poolused [Flags

Windows 2000和之後的語法:

!poolused [Flags [TagString]] 

引數

Flags

指定要顯示的內容和輸出排序的方式。可以是下面這些位值的任意組合,但是bit 1 (0x2) 和 2 (0x4)不能一起使用。預設值為0,僅輸出摘要資訊,以pool tag排序。

Bit 0 (0x1)

顯示詳細資訊。

Bit 1 (0x2)

以非分頁記憶體使用的總數來排序。

Bit 2 (0x4)

以使用分頁記憶體的總數來排序。

Bit 3 (0x8)

(Windows Server 2003和之後) 顯示session pool而不是standard pool。

TagString

(Windows 2000和之後) 指定pool tag。TagString是區分大小寫的ASCII字串。星號 (*) 可用來代表任意數量的字元,問號 (?) 可以用來代表一個字元。如果沒有使用星號,TagString 必須剛好是4個字元的長度。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

!poolused 擴充套件利用Windows的記憶體池標籤(Pool tagging)功能來蒐集資料。Pool tagging在Windows Server 2003和之後版本的Windows中一直是起用的。在Windows XP和之前版本中必須使用Gflags來啟用。

如果在該擴充套件命令執行完成前停止它,偵錯程式中會顯示出部分結果。

該命令會顯示每種標籤的paged pool和nonpaged pool記憶體使用。兩種情況下,顯示中都包含當前使用給定tag分配的次數,以及分配的這些儲存單元使用的位元組數量。

下面是命令輸出的一部分的示例:

0: kd> !poolused
   Sorting by  Tag

  Pool Used:
            NonPaged            Paged
 Tag    Allocs     Used    Allocs     Used
 1394        1      520         0        0UNKNOWN pooltag ‘1394’, please update pooltag.txt
 1MEM        1     3368         0        0UNKNOWN pooltag ‘1MEM’, please update pooltag.txt
 2MEM        1     3944         0        0UNKNOWN pooltag ‘2MEM’, please update pooltag.txt
 3MEM        3      248         0        0UNKNOWN pooltag ‘3MEM’, please update pooltag.txt
 8042        4     3944         0        0PS/2 kb and mouse , Binary: i8042prt.sys
 AGP         1      344         2      384UNKNOWN pooltag ‘AGP ‘, please update pooltag.txt
 AcdN        2     1072         0        0TDI AcdObjectInfoG 
 AcpA        3      192         1      504ACPI Pooltags , Binary: acpi.sys
 AcpB        0        0         4      576ACPI Pooltags , Binary: acpi.sys
 AcpD       40    13280         0        0ACPI Pooltags , Binary: acpi.sys
 AcpF        6      240         0        0ACPI Pooltags , Binary: acpi.sys
 AcpM        0        0         1      128ACPI Pooltags , Binary: acpi.sys
 AcpO        4      208         0        0ACPI Pooltags , Binary: acpi.sys

 WmiG       30     6960         0        0Allocation of WMIGUID 
 WmiR       63     4032         0        0Wmi Registration info blocks 
 Wmip      146     3504       182    18600Wmi General purpose allocation 
 Wmit        1     4096         7    49480Wmi Trace 
 Wrpa        2      720         0        0WAN_ADAPTER_TAG 
 Wrpc        1       72         0        0WAN_CONN_TAG 
 Wrpi        1      120         0        0WAN_INTERFACE_TAG 
 Wrps        2      128         0        0WAN_STRING_TAG 
 aEoP        1      672         0        0UNKNOWN pooltag ‘aEoP’, please update pooltag.txt
 fEoP        1       16         0        0UNKNOWN pooltag ‘fEoP’, please update pooltag.txt
 hSVD        0        0         1       40Shared Heap Tag , Binary: mrxdav.sys
 hibr        0        0         1    24576UNKNOWN pooltag ‘hibr’, please update pooltag.txt
 iEoP        1       24         0        0UNKNOWN pooltag ‘iEoP’, please update pooltag.txt
 idle        2      208         0        0Power Manager idle handler 
 jEoP        1       24         0        0UNKNOWN pooltag ‘jEoP’, please update pooltag.txt
 mEoP        1       88         0        0UNKNOWN pooltag ‘mEoP’, please update pooltag.txt
 ohci        1      136         0        01394 OHCI host controller driver 
 rx..       3     1248         0        0UNKNOWN pooltag ‘  rx’, please update pooltag.txt
 sidg        2       48         0        0GDI spooler events 
 thdd        0        0         1    20480DirectDraw/3D handle manager table 
 usbp       18    77056         2       96UNKNOWN pooltag ‘usbp’, please update pooltag.txt
 vPrt        0        0        18    68160UNKNOWN pooltag ‘vPrt’, please update pooltag.txt
 TOTAL     3570214 209120008     38769 13066104

附加資訊

關於記憶體池和記憶體池標籤的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!poolval

!poolval 擴充套件命令分析pool page 的頭部並診斷任何可能的錯誤。該命令僅在Windows XP和之後版本中可用。

語法

!poolval Address [DisplayLevel

引數

Address

指定要分析頭部的pool的地址。

DisplayLevel

指定輸出中要包含的資訊。可以是任意的下面這些值(預設為0):

0

顯示基本資訊。

1

顯示基本資訊和頭部連結串列(linked header lists)。

2

顯示基本資訊、頭部連結串列和基本的頭資訊。

3

顯示基本資訊、頭部連結串列,以及完整的頭資訊。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

附加資訊

關於記憶體池的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!popolicy

!popolicy 擴充套件顯示目標機的電源策略。

語法

!popolicy [Address]

引數

Address

指定要顯示的電源策略結構的地址。如果省略,則顯示nt!PopPolicy。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是命令輸出的示例:

kd> !popolicy
SYSTEM_POWER_POLICY (R.1) @ 0x80164d58
  PowerButton:      Shutdown  Flags: 00000003   Event: 00000000   Query UI
  SleepButton:          None  Flags: 00000003   Event: 00000000   Query UI
  LidClose:             None  Flags: 00000001   Event: 00000000   Query
  Idle:                 None  Flags: 00000001   Event: 00000000   Query
  OverThrottled:        None  Flags: c0000004   Event: 00000000   Override NoWakes Critical
  IdleTimeout:             0  IdleSensitivity:        50%
  MinSleep:               S0  MaxSleep:               S0
  LidOpenWake:            S0  FastSleep:              S0
  WinLogonFlags:           1  S4Timeout:               0
  VideoTimeout:            0  VideoDim:               209
  SpinTimeout:             0  OptForPower:             1
  FanTolerance:            0% ForcedThrottle:          0%
  MinThrottle:             0%

附加資訊

使用!pocaps 擴充套件命令檢視系統的電源能力(power cababilities)。關於電源能力和電源策略(power policy)的資訊,檢視Windows Driver Kit (WDK)文件,以及Mark Russinovich and David Solomon 編寫的Microsoft
Windows Internals

!prcb

!prcb 擴充套件命令顯示處理器控制塊(processor control block (PRCB))。

語法

!prcb [Processor

引數

Processor

指定要獲得PRCB資訊的處理器。如果省略Processor,則使用處理器0。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

PRCB是處理器控制域(PCR)的一個擴充套件。使用!pcr 命令來顯示PCR。

下面是示例:

kd> !prcb
PRCB for Processor 0 at e0000000818ba000:
Threads–  Current e0000000818bbe10 Next 0000000000000000 Idle e0000000818bbe10
Number 0 SetMember 00000001
Interrupt Count — 0000b81f
Times — Dpc    00000028 Interrupt 000003ff 
         Kernel 00005ef4 User      00000385 

附加資訊

關於PCR和PRCB的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!process

!process 擴充套件顯示指定的程序或所有程序的資訊,包括EPROCESS塊在內。

該命令只能在核心模式除錯時使用。

語法

Windows NT 4.0的語法:

!process [Process [Flags]] 

Windows 2000的語法:

!process [/s Session] [Process [Flags]] 
!process [/s Session0 Flags ImageName 

Windows XP和之後的語法:

!process [/s Session] [/Module] [Process [Flags]] 
!process [/s Session] [/Module0 Flags ImageName 

引數

/s Session

(Windows 2000和之後) 指定擁有給定程序的會話(session)。

/m Module

(Windows XP和之後) 指定擁有需要的程序的模組。

Process

指定目標機上某個程序的16進位制地址或者程序ID。

Process 的值決定了!process 命令顯示的是程序地址還是程序ID。如果在Windows NT 4.0中Process 為-1 ,或在其他任何系統中省略掉,偵錯程式只顯示當前系統程序的資料。如果Process 為0 並且省略ImageName,偵錯程式顯示所有活動程序的資訊。

Flags

指定顯示內容的級別。Flags 可以是下面這些位的任意組合。如果Flags為0,只會顯示很少的資訊。預設值根據Windows版本和Process的值會有所不同。在Windows NT 4.0中,當Process被省略或者設定為0時預設為0x3,否則預設值為0xF。在Windows 2000中,當Process省略,或者Process為0並且省略ImageFile時,預設值是0x3;否則預設值為0xF。在Windows
XP和之後,當Process省略或者為0或-1時,預設值為0x3,否則為0xF。

Bit 0 (0x1)

顯示時間和優先順序統計。

Bit 1 (0x2)

顯示該程序關聯的執行緒和事件列表,以及它們的等待狀態。

Bit 2 (0x4)

顯示程序關聯的執行緒列表。如果沒有同時指定Bit 1(0x2),則每個執行緒顯示在單獨一行上。如果同時指定了Bit 1,則每個執行緒還會顯示堆疊回溯。

Bit 3 (0x8)

(Windows XP和之後) 顯示每個函式的返回地址、堆疊指標,以及(在Itanium系統上)bsp暫存器的值。不顯示函式的引數。

Bit 4 (0x10)

(Windows XP和之後) 在命令執行期間將程序上下文設定為指定的程序。這樣會使得執行緒呼叫堆疊顯示更加精確。因為該標誌相當於對這個程序使用了.process /p /r,會丟棄(discard)任何存在的使用者模式模組列表。當Process 為0時,偵錯程式顯示所有程序,並且顯示每一個時都會切換程序上下文。如果只顯示單個程序,並且它的使用者模式狀態已經被重新整理(例如,使用了.process /p /r),那麼就不需要使用這個標誌。該標誌僅在使用了
Bit 0(0x1)的時候起效。

ImageName

(Windows 2000和之後) 指定要顯示的程序的名字。偵錯程式會顯示所有可執行映像名和ImageName 匹配的程序。映像名必須匹配EPROCESS 塊中的那個。一般來說,這是啟動了該程序的可執行檔案的名字,包含副檔名(一般是.exe),並且第15個字元之後的字元被裁減掉。不能指定包含空格的映像名。指定了ImageName 時,Process 必須為0。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是!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 address

單詞PROCESS 之後的8字元長度的16進位制數字是EPROCESS塊的地址。上面例子中最後一條的程序地址為0x809258E0。

Process ID (PID)

Cid 後的16進位制數字。上面例子中最後一條的PID是0x44,或者10進位制的68。

Process Environment Block (PEB)

Peb 後面的16進位制數字是程序環境塊的地址 。上面例中最後一條的PEB位於0x7FFDE000。

Parent process PID

ParentCid 後面的16進位制數字是父程序的PID。上面例中最後一條的父程序PID為0x26,或者10進位制的38。

Image

擁有該程序的模組名。上例中最後一條的所有者為spoolss.exe。第一條的所有者為作業系統本身。

Process object address

ObjectTable 後的16進位制數字。上例最後一條中,程序物件(process object)地址為0x80925c68。

 

要顯示某個程序的完整資訊,可以將Flags設定為7。可以將Process 設定為程序地址、程序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這樣的其他擴充套件命令,用於獲得更多資訊。

下面表格用於說明前面例子中的各個部分。

成員

含義

WAIT

這個頭後面附加的註釋說明了等待原因。使用命令dt nt!_KWAIT_REASON 可以顯示所有等待原因的列表。

ElapsedTime

列出從程序建立以來經過了多長時間。顯示是以Hours : Minutes: Seconds . Milliseconds格式的。

UserTime

顯示程序在使用者模式下執行的時間。如果UserTime 特別高,可能說明了這個程序正在消耗系統資源。顯示格式和ElapsedTime一樣。

KernelTime

顯示程序在核心模式下執行的時間。如果KernelTime 的值非常高,可能意味著該程序在消耗系統資源。顯示格式和ElapsedTime一樣。

Working Set sizes

顯示程序當前的最小和最大工作集(working set)大小,以頁面數為單位。如果工作集異常的大,說明程序可能存在記憶體洩露,或者消耗了很多系統資源。

QuotaPoolUsage entries

列出程序使用的分頁和非分頁記憶體池。對存在記憶體洩露的系統,檢視所有程序額外的非分頁記憶體使用可以知道哪個程序存在記憶體洩露。

Clone

指示程序是否是由POSIX 或Interix字系統建立的。

Private

指示程序當前使用到的私有(非共享)頁面數量。包括實體記憶體中的和已經換出的記憶體。

除了程序資訊之外,執行緒資訊中還包含被執行緒鎖定的資源列表。這個資訊位於執行緒資訊的第三行。上面例子中,執行緒鎖定了一個位於80144fc0處的SynchronizationEvent 資源。通過將該地址和!kdext*.locks擴充套件命令顯示的鎖的列表對比,可以知道哪個程序擁有資源的排它鎖(exclusive
lock)。

!stacks 擴充套件給出每個執行緒的狀態的簡單摘要。它可以代替!process 用於對系統進行快速的檢視,特別是除錯像資源爭用或者死鎖這樣的多執行緒問題時。

附加資訊

關於核心模式下程序的資訊,檢視改變上下文。關於對程序和執行緒進行分析的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

WinDbg 文件翻譯—-83

cc682/NetRoc

http://netroc682.spaces.live.com/

!pars

!pars 擴充套件顯示指定的processor application registers file。

語法

!pars Address 

引數

Address

指定processor application registers file的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

 

該命令只能對Itanium目標機使用。

!pat

!pat 顯示目標處理器的頁面屬性表暫存器(Page Attribute Table (PAT) registers)。

語法

!pat Flag 
!pat 

引數

Flag

如果設定Flag,偵錯程式在顯示PAT之前會先驗證PAT功能是否存在。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件只能對x86目標機使用。

!pci

!pci 擴充套件命令用來顯示PCI(peripheral component interconnect)匯流排的當前狀態,以及附加到該匯流排上的任何裝置。

語法

!pci [Flags [Bus [Device [Function [MinAddress MaxAddress]]]]] 

引數

Flags

指定輸出級別。可以是下面這些位的任意組合:

Bit 0 (0x1)

顯示詳細輸出。

Bit 1 (0x2)

顯示從bus 0到指定的Bus範圍內的所有匯流排。

Bit 2 (0x4)

顯示中包含原始位元組格式的資訊。如果設定了MinAddressMaxAddress,或者標誌的位0x8,則該標誌也自動被設定。

Bit 3 (0x8)

顯示中包含原始DWORD格式的資訊。

Bit 4 (0x10)

顯示中包含無效裝置的號碼(invalid device number)。如果指定了Device,則跳過該標誌。

Bit 5 (0x20)

顯示中包含無效功能號(invalid function numbers)。

Bit 6 (0x40)

顯示中包含capabilities。

Bit 7 (0x80)

顯示Intel 8086裝置相關資訊(Intel 8086 device-specific information)。

Bit 8 (0x100)

顯示PCI配置空間(PCI configuration space)。

Bus

指定要顯示的匯流排。Bus 可以在0到0xFF範圍之內。如果省略,則顯示primary bus (bus 0)的資訊。如果Flags包含bit 1 (0x2), Bus 用於指定要顯示的最大一個匯流排號。

Device

指定裝置的slot device number。如果省略,則顯示所有裝置的資訊。

Function

指定裝置的slot function number。如果省略,則顯示所有的裝置功能(device function)。

MinAddress

指定要顯示的原始位元組或者原始DWORD的首地址。必須在0到0xFF之間。

MaxAddress

指定要顯示的原始位元組或者原始DWORD的尾地址。必須在0到0xFF之間,並且不能比MinAddress 小。

DLL

Windows NT 4.0

Kext.dll 
Kdextx86.dll

Windows 2000

Kext.dll 
Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件命令只能對x86目標機使用。

註釋

使用!ecb!ecd、或者 !ecw來編輯PCI配置空間(PCI
configuration space)。

下面的例子顯示了所有匯流排和它們的裝置的列表。該命令需要較長時間來執行。偵錯程式掃描目標系統的PCI匯流排時,在顯示的資訊底部可以看到移動的計數器:

kd> !pci 2 ff
PCI Bus 0
00:0  8086:1237.02  Cmd[0106:.mb..s]  Sts[2280:…..]  Device  Host bridge
0d:0  8086:7000.01  Cmd[0007:imb…]  Sts[0280:…..]  Device  ISA bridge
0d:1  8086:7010.00  Cmd[0005:i.b…]  Sts[0280:…..]  Device  IDE controller
0e:0  1011:0021.02  Cmd[0107:imb..s]  Sts[0280:…..]  PciBridge 0->1-1  PCI-PCI bridge
10:0  102b:0519.01  Cmd[0083:im….]  Sts[0280:…..]  Device  VGA compatible controller
PCI Bus 1
08:0  10b7:9050.00  Cmd[0107:imb..s]  Sts[0200:…..]  Device  Ethernet
09:0  9004:8178.00  Cmd[0117:imb..s]  Sts[0280:…..]  Device  SCSI controller

下面的例子顯示primary bus 上裝置的詳細資訊。每行開頭的兩位數字是裝置號(device number),後面跟的一位數字是功能號(function number):

kd> !pci 1 0
PCI Bus 0
00:0  8086:1237.02  Cmd[0106:.mb..s]  Sts[2280:…..]  Device  Host bridge
      cf8:80000000  IntPin:0  IntLine:0  Rom:0  cis:0  cap:0

0d:0  8086:7000.01  Cmd[0007:imb…]  Sts[0280:…..]  Device  ISA bridge
      cf8:80006800  IntPin:0  IntLine:0  Rom:0  cis:0  cap:0

0d:1  8086:7010.00  Cmd[0005:i.b…]  Sts[0280:…..]  Device  IDE controller
      cf8:80006900  IntPin:0  IntLine:0  Rom:0  cis:0  cap:0
      IO[4]:fff1       

0e:0  1011:0021.02  Cmd[0107:imb..s]  Sts[0280:…..]  PciBridge 0->1-1  PCI-PCI bridge
      cf8:80007000  IntPin:0  IntLine:0  Rom:0  cap:0  2sts:2280  BCtrl:6 ISA
      IO:f000-ffff  Mem:fc000000-fdffffff  PMem:fff00000-fffff

10:0  102b:0519.01  Cmd[0083:im….]  Sts[0280:…..]  Device  VGA compatible controller
      cf8:80008000  IntPin:1  IntLine:9  Rom:80000000  cis:0  cap:0
      MEM[0]:fe800000  MPF[1]:fe000008  

下面的例子顯示bus 0,裝置0x0D,功能0x01的更詳細一些的資訊,包括從地址0x00到0x3F之間的原始DWORD值:

kd> !pci f 0 d 1 0 3f
PCI Bus 0
0d:1  8086:7010.00  Cmd[0005:i.b…]  Sts[0280:…..]  Device  IDE controller
      cf8:80006900  IntPin:0  IntLine:0  Rom:0  cis:0  cap:0
      IO[4]:fff1       
      00000000:  70108086 02800005 01018000 00002000
      00000010:  00000000 00000000 00000000 00000000
      00000020:  0000fff1 00000000 00000000 00000000
      00000030:  00000000 00000000 00000000 00000000

附加資訊

檢視Plug and Play 除錯獲得該擴充套件命令的應用和更多示例。關於PCI匯流排的資訊,檢視Windows Driver Kit (WDK)文件。

!pciir

!pciir 擴充套件顯示從PCI裝置到中斷控制器輸入(interrupt controller input)的硬體路由(hardware routing)的內容。

語法

!pciir 

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP
Windows Server 2003

Kdexts.dll

Windows Vista和之後

不可用

該擴充套件命令只能在未啟用ACPI(Advanced Configuration and Power Interface)的x86目標機上使用。

附加資訊

使用!acpiirqarb 擴充套件在啟用ACPI的機器上檢視類似資訊。

關於PCI匯流排的資訊,檢視Windows Driver Kit (WDK)文件。

!pcitree

!pcitree 擴充套件顯示PCI裝置物件的資訊,包括子PCI匯流排和CardBus匯流排,以及附加到他們上的裝置。

語法

!pcitree 

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是一個示例:

kd> !pcitree

Bus 0x0 (FDO Ext fe517338)
  0600 12378086 (d=0,  f=0) devext fe4f4ee8 Bridge/HOST to PCI
  0601 70008086 (d=d,  f=0) devext fe4f4ce8 Bridge/PCI to ISA
  0101 70108086 (d=d,  f=1) devext fe4f4ae8 Mass Storage Controller/IDE
  0604 00211011 (d=e,  f=0) devext fe4f4788 Bridge/PCI to PCI

Bus 0x1 (FDO Ext fe516998)
  0200 905010b7 (d=8,  f=0) devext fe515ee8 Network Controller/Ethernet
  0100 81789004 (d=9,  f=0) devext fe515ce8 Mass Storage Controller/SCSI
  0300 0519102b (d=10, f=0) devext fe4f4428 Display Controller/VGA

Total PCI Root busses processed = 1

要根據最後的裝置顯示來理解輸出的內容。它的base class 為03、subclass 為00、Device ID 為0x0519,、Vendor ID 為0x102B。這些值是裝置本身固有的。

"d="後面的數字是裝置號;"f="後的數字是功能號(function number)。"devext"後是裝置擴充套件的地址: 0xFE4F4428。最後顯示base class 名字和subclass名字。

要獲得某個裝置的更多資訊,可以使用!devext 擴充套件命令,並且將裝置擴充套件地址作為引數。對這類裝置,命令應該像下面一樣:

kd> !devext fe4f4428 pci 

如果!pcitree 擴充套件產生一個錯誤,通常意味著PCI符號沒有正確的載入。使用.reload pci.sys來修正這個問題。

附加資訊

檢視Plug and Play除錯來獲得該擴充套件命令的應用。關於PCI匯流排和PCI裝置物件的資訊,檢視 Windows Driver Kit (WDK)文件。

!pcm

!pcm 擴充套件顯示指定的private cache map。該擴充套件僅在Windows 2000中可用。

語法

!pcm Address 

引數

Address

指定private cache map的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

不可用(檢視註釋節)

註釋

該擴充套件僅在Windwos 2000中支援。在Windows XP和之後的Windows中,可以使用dt nt!_PRIVATE_CACHE_MAP Address命令。

附加資訊

關於快取管理的資訊,檢視Microsoft Windows SDK 文件,以及Mark Russinovich 和David Solomon編寫的Microsoft Windows Internals

其他快取管理命令的資訊,可以檢視!cchelp擴充套件的參考。

!pcr

!pcr 擴充套件顯示指定處理器上的處理器控制域(Processor Control Region (PCR))的當前狀態。

語法

!pcr [Processor

引數

Processor

指定要獲取哪個處理器的PCR資訊。如果省略Processor,則使用當前處理器。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

處理器控制塊(PRCB)是PCR的一個擴充套件。可以通過!prcb 命令來顯示。

下面是x86目標機上的!pcr擴充套件命令的示例:

kd> !pcr 0
KPCR for Processor 0 at ffdff000:
    Major 1 Minor 1
      NtTib.ExceptionList: 801626e0
          NtTib.StackBase: 801628f0
         NtTib.StackLimit: 8015fb00
       NtTib.SubSystemTib: 00000000
            NtTib.Version: 00000000
        NtTib.UserPointer: 00000000
            NtTib.SelfTib: 00000000

                  SelfPcr: ffdff000
                     Prcb: ffdff120
                     Irql: 00000000
                      IRR: 00000000
                      IDR: ffffffff
            InterruptMode: 00000000
                      IDT: 80043400
                      GDT: 80043000
                      TSS: 803cc000

            CurrentThread: 8015e8a0
               NextThread: 00000000
               IdleThread: 8015e8a0

                DpcQueue:  0x80168ee0 0x80100d04 ntoskrnl!KiTimerExpiration
                          

顯示中的一個條目是中斷請求級別(IRQL)。!pcr 擴充套件顯示的是當前IRQL,但是通常對當前IRQL都不是很感興趣。Bug check或者偵錯程式連線之前的IRQL要更加有用一些。可以通過!irql來顯示這種IRQL,但是隻有針對執行Windows Server2003和之後版本Windows的機器才有用。

附加資訊

關於PCR和PRCB的更多資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!pcrs

!pcrs 擴充套件命令顯示Intel Itanium處理器的控制暫存器(control register)。

語法

!pcrs Address 

引數

Address

指定processor control registers file的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該擴充套件命令只能對Itanium目標機使用。

註釋

不要將!pcrs擴充套件和 !pcr 混淆,後者用來顯示處理器控制域(processor control region)的當前狀態。

!pfn

!pfn 擴充套件用於顯示指定的頁面幀(page frame)或者整個頁面幀資料庫(page frame database)。

語法

!pfn PageFrame 

引數

PageFrame

指定要顯示的頁面幀的16進位制序號。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

可以通過!pte擴充套件獲得某個虛擬地址的頁面幀序號。

下面是該擴充套件的輸出示例:

kd> !pte 801544f4
801544F4  – PDE at C0300800        PTE at C0200550
          contains 0003B163      contains 00154121
        pfn 3b G-DA–KWV    pfn 154 G–A–KRV

kd> !pfn 3b
    PFN 0000003B at address 82350588
    flink       00000000  blink / share count 00000221  pteaddress C0300800
    reference count 0001                                 color 0
    restore pte 00000000  containing page        000039  Active           
               

kd> !pfn 154
    PFN 00000154 at address 82351FE0
    flink       00000000  blink / share count 00000001  pteaddress C0200550
    reference count 0001                                 color 0
    restore pte 00000060  containing page        00003B  Active     M     
    Modified          

附加資訊

關於頁表、頁目錄、頁面幀的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!pmc

!pmc 擴充套件顯示指定地址處的效能監控計數器(Performance Monitor Counter (PMC))暫存器。

該命令僅在Itanium目標機上支援。

語法

!pmc [ OptionExpression [DisplayLevel

引數

Option

可以是下面這些值中任意一個:

gen

將該暫存器當作常規PMC暫存器顯示。

btb

將該暫存器當作branch trace buffer (BTB) PMC暫存器進行顯示。

Expression

指定PMC的16進位制地址。可以使用表示式@kpfcgen 和@kpfcbtb 用作引數的值。

如果Expression @kpfcgen,偵錯程式將當前處理器的PMC暫存器當作常規PMC暫存器顯示。還可以通過將Option 設定為gen,並且Expression 值使用@kpfc4@kpfc5@kpfc6或者@kpfc7來將當前處理器的PMC暫存器作為常規PMC暫存器顯示。

如果Expression @kpfcbtb,偵錯程式將當前處理器的PMC暫存器當作BTB PMC暫存器顯示。也可以通過Optio設定為btb,並且Expression 的值使用@kpfc12來當作BTB PMC暫存器顯示。

DisplayLevel

可以是下面這些值中任意一個:

0

僅顯示每個PMC暫存器欄位的值。這是預設情況。

1

顯示非保留和非忽略的PCM暫存器欄位的詳細資訊。

2

顯示所有PMC暫存器欄位的詳細資訊,包括被忽略的和保留的。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

!pmssa

!pmssa 擴充套件顯示指定的processor Minimal State Save Area (也稱為Min-StateSave Area)。

該擴充套件命令僅在Itanium目標機上可用。

語法

!pmssa Address 

引數

Address

指定某個processor Min-StateSave Area的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

!pnpevent

!pnpevent 擴充套件顯示即插即用(Plug and Play)裝置事件佇列。

語法

!pnpevent [DeviceEvent

引數

DeviceEvent

指定要顯示的裝置事件(device event)的地址。如果為0或者省略,則顯示該佇列中所有裝置事件的樹(tree)。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

附加資訊

檢視Plug and Play除錯獲得該擴充套件命令的應用。關於Plug and Play驅動程式的資訊,檢視Windows Driver Kit (WDK) 文件。

!pocaps

!pocaps 擴充套件顯示目標機的電源能力(power capability)。

語法

!pocaps 

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是該命令輸出的示例:

kd> !pocaps
PopCapabilities @ 0x8016b100
  Misc Supported Features:  S4 FullWake
  Processor Features:      
  Disk Features:            SpinDown
  Battery Features:        
  Wake Caps
    Ac OnLine Wake:         Sx
    Soft Lid Wake:          Sx
    RTC Wake:               Sx
    Min Device Wake:        Sx
    Default Wake:           Sx

附加資訊

要檢視系統的電源策略(power policy),可以使用!popolicy 擴充套件命令。關於電源能力和電源策略的更多資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows
Internals

!pool

!pool擴充套件顯示指定的記憶體池分配的資訊,或者整個系統範圍內記憶體池的分配資訊。

語法

!pool [Address [Flags]] 

引數

Address

指定要顯示的記憶體池入口。如果Address是 -1,該命令顯示程序中所有堆(all heaps in the process)的資訊。如果Address 為0或省略,命令顯示程序堆(process heap)的資訊。

Flags

指定顯示的級別。可以是下面這些位值的任意組合,預設值為0:

Bit 0 (0x1)

顯示記憶體池內容,而不僅僅是頭部(pool header)。

Bit 1 (0x2)

(Windows 2000和之後) 不顯示所有記憶體池的頭資訊,除了實際包含指定的Address的那個。

Bit 31 (0x80000000)

(Windows XP和之後) 不顯示池型別(type)和標籤(tag)。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

在Windows XP和之後版本的Windows中,!pool 擴充套件顯示每個分配關聯的記憶體池標籤(pool tag)。還會顯示該標籤的所有者。顯示是基於pooltag.txt 檔案的內容的。該檔案位於Windwos除錯工具包安裝目錄的triage 子目錄下。如果需要的話,可以通過編輯該檔案來新增自己的專案相關的其他pool tag。

警告  如果在當前版本安裝的目錄上安裝Windwos除錯工具包的升級版本,則它會覆蓋該目錄中所有檔案,包括pooltag.txt。如果改變或者替換了示例的pooltag.txt,則要將它先儲存到其他目錄中。重新安裝偵錯程式之後,可以再用儲存的那個pooltag.txt來進行覆蓋。

如果!pool 擴充套件報告記憶體池破壞,應該使用!poolval來進行調查。

下面是一個例子。如果Address 指定0xE1001050,則顯示這個塊中的所有記憶體池的頭部,並且0xE1001050本身用星號(*)標記。

kd> !pool e1001050 
 e1001000 size:   40 previous size:    0  (Allocated)  MmDT
 e1001040 size:   10 previous size:   40  (Free)       Mm  
*e1001050 size:   10 previous size:   10  (Allocated) *ObDi
 e1001060 size:   10 previous size:   10  (Allocated)  ObDi
 e1001070 size:   10 previous size:   10  (Allocated)  Symt
 e1001080 size:   40 previous size:   10  (Allocated)  ObDm
 e10010c0 size:   10 previous size:   40  (Allocated)  ObDi
…..

這個例子中,最右邊的一列是pool tag。這一列左邊顯示這個pool是空閒的還是已分配的。

下面的命令顯示記憶體池頭部和內容(pool headers and pool contents):

kd> !pool e1001050 1
 e1001000 size:   40 previous size:    0  (Allocated)  MmDT
    e1001008  ffffffff 0057005c 004e0049 004f0044
    e1001018  ffffffff 0053005c 00730079 00650074

 e1001040 size:   10 previous size:   40  (Free)       Mm  
    e1001048  ffffffff e1007ba8 e1501a58 01028101
    e1001058  ffffffff 00000000 e1000240 01028101

*e1001050 size:   10 previous size:   10  (Allocated) *ObDi
    e1001058  ffffffff 00000000 e1000240 01028101
    e1001068  ffffffff 00000000 e10009c0 01028101

 e1001060 size:   10 previous size:   10  (Allocated)  ObDi
    e1001068  ffffffff 00000000 e10009c0 01028101
    e1001078  ffffffff 00000000 00000000 04028101

……

附加資訊

關於記憶體池的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

7月24日

WinDbg 文件翻譯—-82

cc682/NetRoc

http://netroc682.spaces.live.com/

!mca

在x86目標機上,!mca 擴充套件用於顯示機器檢查架構(machine check architecture (MCA))暫存器。在Itanium目標機上,!mca用於顯示MCA錯誤記錄。

語法

x86 目標機語法

!mca 

Itanium目標機語法

!mca Address [Flags

引數

Address

(僅Itanium目標) 指定MCA錯誤記錄的地址。

Flags

(僅Itanium目標) 指定顯示級別。Flags 可以是下面這些位的任意組合。預設值為0xFF,會顯示日誌中的所有部分(section)。

Bit 0 (0x1)

顯示處理器部分(section)。

Bit 1 (0x2)

顯示平臺相關部分(platform-specific section)。

Bit 2 (0x4)

顯示記憶體部分(memory section)

Bit 3 (0x8)

顯示PCI元件部分。

Bit 4 (0x10)

顯示PCI匯流排部分。

Bit 5 (0x20)

顯示SystemEvent Log部分。

Bit 6 (0x40)

顯示平臺控制器(platform host controller)部分。

Bit 7 (0x80)

顯示平臺匯流排(platform bus)部分。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件命令只能針對x86或Itanium目標機使用。

註釋

在Itanium目標上,!mca 顯示系統抽象層(system abstraction layer (SAL))中的MCA錯誤記錄。下面是該擴充套件輸出的示例:

kd> !mca e0000165f3f58000
hal!HalpFeatureBits: 0xf [HAL_PERF_EVENTS|HAL_MCA_PRESENT|HAL_CMC_PRESENT|HAL_CPE_PRESENT]
 
MCA Error Record Header @ 0xe0000165f3f58000 0xe0000165f3f597a8
   Id               : 8
   Revision         :
      Revision         : 2
      Minor            : 0x2 ”
      Major            : 0 ”
   ErrorSeverity    : 0 ”
   Valid            :
      Valid            : 0 ”
      OemPlatformID    : 0y0
      Reserved         : 0y0000000 (0)
   Length           : 0x17a8
   TimeStamp        :
      TimeStamp        : 0x20031106`00134944
      Seconds          : 0x44 ‘D’
      Minutes          : 0x49 ‘I’
      Hours            : 0x13 ”
      Reserved         : 0 ”
      Day              : 0x6 ”
      Month            : 0x11 ”
      Year             : 0x3 ”
      Century          : 0x20 ‘ ‘
   OemPlatformId    : [16]  ""
 

   Severity  : ErrorRecoverable
 
MCA Error Section Header @ 0xe0000165f3f58028 0xe0000165f3f59578   [Processor]
   Header           :
      Guid             :
         Data1            : 0xe429faf1
         Data2            : 0x3cb7
         Data3            : 0x11d4
         Data4            : [8]  "???"
      Revision         :
         Revision         : 2
         Minor            : 0x2 ”
         Major            : 0 ”
      RecoveryInfo     :
         RecoveryInfo     : 0 ”
         Corrected        : 0y0
         NotContained     : 0y0
         Reset            : 0y0
         Reserved         : 0y0000
         Valid            : 0y0
      Reserved         : 0 ”
      Length           : 0x1550
   Valid            :
      Valid            : 0x100101f
      ErrorMap         : 0y1
      StateParameter   : 0y1
      CRLid            : 0y1
      StaticStruct     : 0y1
      CacheCheckNum    : 0y0001
      TlbCheckNum      : 0y0000
      BusCheckNum      : 0y0001
      RegFileCheckNum  : 0y0000
      MsCheckNum       : 0y0000
      CpuIdInfo        : 0y1
      Reserved         : 0y000000000000000000000000000000000000000 (0)
   ErrorMap         :
      ErrorMap         : 0x1002000
      Cid              : 0y0000
      Tid              : 0y0000
      Eic              : 0y0000
      Edc              : 0y0010
      Eit              : 0y0000
      Edt              : 0y0000
      Ebh              : 0y0001
      Erf              : 0y0000
      Ems              : 0y0000000000000000 (0)
      Reserved         : 0y0000000000000000 (0)
   StateParameter   :
      StateParameter   : 0x28000000`fff21130
      reserved0        : 0y00
      rz               : 0y0
      ra               : 0y0
      me               : 0y1
      mn               : 0y1
      sy               : 0y0
      co               : 0y0
      ci               : 0y1
      us               : 0y0
      hd               : 0y0
      tl               : 0y0
      mi               : 0y1
      pi               : 0y0
      pm               : 0y0
      dy               : 0y0
      in               : 0y0
      rs               : 0y1
      cm               : 0y0
      ex               : 0y0
      cr               : 0y1
      pc               : 0y1
      dr               : 0y1
      tr               : 0y1
      rr               : 0y1
      ar               : 0y1
      br               : 0y1
      pr               : 0y1
      fp               : 0y1
      b1               : 0y1
      b0               : 0y1
      gr               : 0y1
      dsize            : 0y0000000000000000 (0)
      reserved1        : 0y00000000000 (0)
      cc               : 0y1
      tc               : 0y0
      bc               : 0y1
      rc               : 0y0
      uc               : 0y0
   CRLid            :
      LocalId          : 0
      reserved         : 0y0000000000000000 (0)
      eid              : 0y00000000 (0)
      id               : 0y00000000 (0)
      ignored          : 0y00000000000000000000000000000000 (0)
 
   CacheErrorInfo[0]:
 
   Valid            : 1
   CheckInfo        : 0y1
   RequestorIdentifier : 0y0
   ResponderIdentifier : 0y0
   TargetIdentifier : 0y0
   PreciseIP        : 0y0
   Reserved         : 0y00000000000000000000000000000000000000000000000000000000000 (0)
   CheckInfo       : 0x0
   RequestorId     : 0x0
   ResponderId     : 0x0
   TargetIp        : 0x0
   TargetId        : 0x0
   PreciseIp       : 0x0
 
   CheckInfo:
 
   CacheCheck       : 0
   Operation        : 0y0000
   Level            : 0y00
   Reserved1        : 0y00
   DataLine         : 0y0
   TagLine          : 0y0
   DataCache        : 0y0
   InstructionCache : 0y0
   MESI             : 0y000
   MESIValid        : 0y0
   Way              : 0y00000 (0)
   WayIndexValid    : 0y0
   Reserved2        : 0y0000000000 (0)
   Index            : 0y00000000000000000000 (0)
   Reserved3        : 0y00
   InstructionSet   : 0y0
   InstructionSetValid : 0y0
   PrivilegeLevel   : 0y00
   PrivilegeLevelValid : 0y0
   MachineCheckCorrected : 0y0
   TargetAddressValid : 0y0
   RequestIdValid   : 0y0
   ResponderIdValid : 0y0
   PreciseIPValid   : 0y0
 

   BusErrorInfo[0]:
 
   Valid            : 9
   CheckInfo        : 0y1
   RequestorIdentifier : 0y0
   ResponderIdentifier : 0y0
   TargetIdentifier : 0y1
   PreciseIP        : 0y0
   Reserved         : 0y00000000000000000000000000000000000000000000000000000000000 (0)
   CheckInfo       : 0x1080000003000144
   RequestorId     : 0x0
   ResponderId     : 0x0
   TargetIp        : 0x0
   TargetId        : 0xd0022004
   PreciseIp       : 0x0
 
   CheckInfo:
 
   BusCheck         : 0x10800000`03000144
   Size             : 0y00100 (0x4)
   Internal         : 0y0
   External         : 0y1
   CacheTransfer    : 0y0
   Type             : 0y00000001 (0x1)
   Severity         : 0y00000 (0)
   Hierarchy        : 0y00
   Reserved1        : 0y0
   Status           : 0y00000011 (0x3)
   Reserved2        : 0y0000000000000000000000 (0)
   InstructionSet   : 0y0
   InstructionSetValid : 0y1
   PrivilegeLevel   : 0y00
   PrivilegeLevelValid : 0y0
   MachineCheckCorrected : 0y0
   TargetAddressValid : 0y1
   RequestIdValid   : 0y0
   ResponderIdValid : 0y0
   PreciseIPValid   : 0y0
 
   StaticInfo @ 0xe0000165f3f580f0 0xe0000165f3f59578
 
   Valid @ 0xe0000165f3f580f0
 
   Valid            : 0x3f
   MinState         : 0y1
   BR               : 0y1
   CR               : 0y1
   AR               : 0y1
   RR               : 0y1
   FR               : 0y1
   Reserved         : 0y0000000000000000000000000000000000000000000000000000000000 (0)
 
   MinState @ 0xe0000165f3f580f8 0xe0000165f3f584f0
 
   IntNats          : 0
   IntGp            : 0xe0000165`f1a99b00
   IntT0            : 0
   IntT1            : 0xe0f0e0f0`e0f0e000
   IntS0            : 0
   IntS1            : 1
   IntS2            : 0xe0000000`83068300
   IntS3            : 0xe0000000`832f8780
   IntV0            : 0x4600
   IntT2            : 0x230
   IntT3            : 0x3ff
   IntT4            : 0xe0000165`f38c6000
   IntSp            : 0xe0000165`f0f97da0
   IntTeb           : 0
   IntT5            : 0
   IntT6            : 0xfffff630
   B0R16            : 0x1010`082a6018
   B0R17            : 0
   B0R18            : 0xe0000000`830067c0
   B0R19            : 0x101
   B0R20            : 0x80000000`00000308
   B0R21            : 0
   B0R22            : 0xe0000000`84bedd20
   B0R23            : 0xe0000000`84bedd20
   B0R24            : 0xe0000165`f213df5a
   B0R25            : 0xfff80000`597c84f0
   B0R26            : 0x6081
   B0R27            : 0xfffffe00`00165f20
   B0R28            : 0x8000465
   B0R29            : 0x8000465
   B0R30            : 0x60
   B0R31            : 0xa04`00000000
   IntT7            : 0x44
   IntT8            : 0x200
   IntT9            : 0xe0000165`f38c6000
   IntT10           : 0xe0000165`f3cb81bc
   IntT11           : 0xe0000165`f3cb81b8
   IntT12           : 0xe0000000`8363f7b0
   IntT13           : 0xe0000165`f1899d08
   IntT14           : 0x9804c`8a70433f
   IntT15           : 0xe0000000`832821f8
   IntT16           : 0xe0000000`836536e0
   IntT17           : 0xe0000000`8363f7b8
   IntT18           : 0xffffffff`fffffbc3
   IntT19           : 0xe0000165`f1ff6000
   IntT20           : 0x2400580
   IntT21           : 0xe0000165`f1ff6004
   IntT22           : 0xe0000165`f3cb8dc0
   Preds            : 0x2277
   BrRp             : 0xe0000165`ea212df0
   RsRSC            : 3
   StIIP            : 0xe0000165`f1895370
   StIPSR           : 0x1010`082a6018
   StIFS            : 0x80000000`00000285
   XIP              : 0xe0000165`ea212c50
   XPSR             : 0x1010`082a6018
   XFS              : 0x80000000`00000b1c
 
   BR @ 0xe0000165f3f584f8 0xe0000165f3f58530
 
e0000165`f3f584f8  e0000165`ea212df0 USBPORT!USBPORT_StopDevice+0x850
e0000165`f3f58500  00000000`00000000
e0000165`f3f58508  00000000`00000000
e0000165`f3f58510  00000000`00000000
e0000165`f3f58518  00000000`00000000
e0000165`f3f58520  00000000`00000000
e0000165`f3f58528  e0000000`832cb061 nt!NtClose+0x1
e0000165`f3f58530  e0000165`f1895320 usbohci!OHCI_StopController
 
   CR @ 0xe0000165f3f58538 0xe0000165f3f58930
 
e0000165`f3f58538  00000000`00007e05
e0000165`f3f58540  00000154`a7047201
e0000165`f3f58548  e0000000`83230000 nt!KiVhptTransVector
e0000165`f3f58550  00000000`00000000

e0000165`f3f585c8  00000000`00000000
e0000165`f3f585d0  e0000165`f1895370 usbohci!OHCI_StopController+0x50
e0000165`f3f585d8  e0000165`f213df5a
e0000165`f3f585e0  00000000`00000060
e0000165`f3f585e8  e0000165`f1895360 usbohci!OHCI_StopController+0x40
e0000165`f3f585f0  80000000`00000285

e0000165`f3f58930  00000000`00000000
 
   AR @ 0xe0000165f3f58938 0xe0000165f3f58d30
 
e0000165`f3f58938  00000000`00000000
e0000165`f3f58940  00000000`00000000
e0000165`f3f58948  00000000`00000000
e0000165`f3f58950  00000000`00000000
e0000165`f3f58958  00000000`00000000
e0000165`f3f58960  00000000`00000006
e0000165`f3f58968  e0000000`8301add0 nt!KiMemoryFault
e0000165`f3f58970  00000000`00000000
e0000165`f3f58978  00000000`00000000
e0000165`f3f58980  00000000`00000000
e0000165`f3f58988  00000000`00000000
e0000165`f3f58990  00000000`00000000
e0000165`f3f58998  00000000`00000000
e0000165`f3f589a0  00000000`00000000
e0000165`f3f589a8  00000000`00000000
e0000165`f3f589b0  00000000`00000000
e0000165`f3f589b8  e0000165`f1895370 usbohci!OHCI_StopController+0x50
e0000165`f3f589c0  e0000165`f0f988e0

e0000165`f3f58d30  00000000`00000000
 
   RR @ 0xe0000165f3f58d38 0xe0000165f3f58d70
 
e0000165`f3f58d38  00000000`00000535
e0000165`f3f58d40  00000000`00000535
e0000165`f3f58d48  00000000`00000535
e0000165`f3f58d50  00000000`00000535
e0000165`f3f58d58  00000000`00000535
e0000165`f3f58d60  00000000`00000535
e0000165`f3f58d68  00000000`00000535
e0000165`f3f58d70  00000000`00000535
 
   FR @ 0xe0000165f3f58d78 0xe0000165f3f59570
 
e0000165`f3f58d78  00000000`00000000
e0000165`f3f58d80  00000000`00000000
e0000165`f3f58d88  80000000`00000000
e0000165`f3f58d90  00000000`0000ffff
e0000165`f3f58d98  00000000`00000000
e0000165`f3f58da0  00000000`00000000
e0000165`f3f58da8  00000000`00000000
e0000165`f3f58db0  00000000`00000000

e0000165`f3f59570  00000000`00000000
 

MCA Error Section Header @ 0xe0000165f3f59578 0xe0000165f3f596a0   [PciComponent]
   Header           :
      Guid             :
         Data1            : 0xe429faf6
         Data2            : 0x3cb7
         Data3            : 0x11d4
         Data4            : [8]  "???"
      Revision         :
         Revision         : 2
         Minor            : 0x2 ”
         Major            : 0 ”
      RecoveryInfo     :
         RecoveryInfo     : 0x80 ”
         Corrected        : 0y0
         NotContained     : 0y0
         Reset            : 0y0
         Reserved         : 0y0000
         Valid            : 0y1
      Reserved         : 0 ”
      Length           : 0x128
   Valid            :
      Valid            : 0x23
      ErrorStatus      : 0y1
      Info             : 0y1
      MemoryMappedRegistersPairs : 0y0
      ProgrammedIORegistersPairs : 0y0
      RegistersDataPairs : 0y0
      OemData          : 0y1
      Reserved         : 0y0000000000000000000000000000000000000000000000000000000000 (0)
   ErrorStatus      :
      Status           : 0x121900
      Reserved0        : 0y00000000 (0)
      Type             : 0y00011001 (0x19)
      Address          : 0y0
      Control          : 0y1
      Data             : 0y0
      Responder        : 0y0
      Requestor        : 0y1
      FirstError       : 0y0
      Overflow         : 0y0
      Reserved1        : 0y00000000000000000000000000000000000000000 (0)
   Info             :
      VendorId         : 0x8086
      DeviceId         : 0x100e
      ClassCodeInterface : 0 ”
      ClassCodeSubClass : 0 ”
      ClassCodeBaseClass : 0x2 ”
      FunctionNumber   : 0 ”
      DeviceNumber     : 0x3 ”
      BusNumber        : 0xa0 ”
      SegmentNumber    : 0 ”
      Reserved0        : 0 ”
      Reserved1        : 0
   MemoryMappedRegistersPairs : 0
   ProgrammedIORegistersPairs : 0
 
   OemData @ 0xe0000165f3f595b8   0xe0000165f3f596a0
 
      Data Length = 0xe6
      Data:
e0000165`f3f595ba  00 00 00 00 00 00 91 d3-86 d3 7a 5e 7e 48 a4 0a  ……….z^~H..
e0000165`f3f595ca  2b f6 f7 a6 cc ca 00 ff-ff ff ff ff ff ff 09 00  +……………
e0000165`f3f595da  00 00 00 00 00 00 00 00-00 00 08 00 00 00 86 80  …………….
e0000165`f3f595ea  0e 10 47 01 30 22 08 00-00 00 08 00 00 00 02 00  ..G.0"……….
e0000165`f3f595fa  00 02 20 80 00 00 10 00-00 00 08 00 00 00 00 00  .. ………….
e0000165`f3f5960a  00 d0 00 00 00 00 18 00-00 00 08 00 00 00 81 a0  …………….
e0000165`f3f5961a  00 00 00 00 00 00 20 00-00 00 08 00 00 00 00 00  …… ………
e0000165`f3f5962a  00 00 00 00 00 00 28 00-00 00 08 00 00 00 00 00  ……(………
e0000165`f3f5963a  00 00 3c 10 74 12 30 00-00 00 08 00 00 00 00 00  ..<.t.0………
e0000165`f3f5964a  00 00 dc 00 00 00 38 00-00 00 08 00 00 00 00 00  ……8………
e0000165`f3f5965a  00 00 2a 01 ff 00 e4 00-00 00 08 00 00 00 07 f0  ..*………….
e0000165`f3f5966a  1e 00 00 00 40 04 00 00-00 00 00 00 00 00 00 00  …[email protected]………..
e0000165`f3f5967a  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  …………….
e0000165`f3f5968a  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  …………….
e0000165`f3f5969a  00 00 00 00 00 00                                ……
 

MCA Error Section Header @ 0xe0000165f3f596a0 0xe0000165f3f597a8   [PciBus]
   Header           :
      Guid             :
         Data1            : 0xe429faf4
         Data2            : 0x3cb7
         Data3            : 0x11d4
         Data4            : [8]  "???"
      Revision         :
         Revision         : 2
         Minor            : 0x2 ”
         Major            : 0 ”
      RecoveryInfo     :
         RecoveryInfo     : 0x84 ”
         Corrected        : 0y0
         NotContained     : 0y0
         Reset            : 0y1
         Reserved         : 0y0000
         Valid            : 0y1
      Reserved         : 0 ”
      Length           : 0x108
   Valid            :
      Valid            : 0x74f
      ErrorStatus      : 0y1
      ErrorType        : 0y1
      Id               : 0y1
      Address          : 0y1
      Data             : 0y0
      CmdType          : 0y0
      RequestorId      : 0y1
      ResponderId      : 0y0
      TargetId         : 0y1
      OemId            : 0y1
      OemData          : 0y1
      Reserved         : 0y00000000000000000000000000000000000000000000000000000 (0)
   ErrorStatus      :
      Status           : 0x121900
      Reserved0        : 0y00000000 (0)
      Type             : 0y00011001 (0x19)
      Address          : 0y0
      Control          : 0y1
      Data             : 0y0
      Responder        : 0y0
      Requestor        : 0y1
      FirstError       : 0y0
      Overflow         : 0y0
      Reserved1        : 0y00000000000000000000000000000000000000000 (0)
   Type             :
      Type             : 0x4 ”
      Reserved         : 0 ”
   Id               :
      BusNumber        : 0xa0 ”
      SegmentNumber    : 0 ”
   Reserved         : [4]  ""
   Address          : 0xd0022054
   Data             : 0
   CmdType          : 0
   RequestorId      : 0xfed2a000
   ResponderId      : 0
   TargetId         : 0xd0022054
   OemId            : [16]  ".???"
   OemData          :
      Length           : 0x98
 
 
 
CP M/R/F/A Manufacturer     SerialNumber     Features         Speed
 0 1,5,31,0 GenuineIntel     0000000000000000 0000000000000001 1000 Mhz

在x86目標上,!mca 顯示由活動處理器支援的machine check 暫存器。還會顯示基本的CPU資訊(和!cpuinfo顯示的一樣)。下面是該擴充套件的輸出示例:

0: kd> !mca
MCE: Enabled, Cycle Address: 0x00000001699f7a00, Type: 0x0000000000000000

MCA: Enabled, Banks 5, Control Reg: Supported, Machine Check: None.
Bank  Error  Control Register     Status Register
  0. None   0x000000000000007f   0x0000000000000000

  1. None   0x00000000ffffffff   0x0000000000000000

  2. None   0x00000000000fffff   0x0000000000000000

  3. None   0x0000000000000007   0x0000000000000000

  4. None   0x0000000000003fff   0x0000000000000000

No register state available.

CP F/M/S Manufacturer   MHz Update Signature Features
 0 15,5,0 SomeBrandName 1394 0000000000000000 a0017fff

注意該擴充套件需要HAL的私有符號。如果沒有這些符號,擴充套件命令會顯示資訊"HalpFeatureBits not found",以及基本CPU資訊。例如 :

kd> !mca
HalpFeatureBits not found
CP F/M/S Manufacturer  MHz Update Signature Features
 0 6,5,1 GenuineIntel  334 0000004000000000 00001fff

!memlist

!memlist 擴充套件用來掃描頁面幀序號資料庫(page frame number (PFN) database)中的實體記憶體列表,以檢查它們的一致性。

語法

!memlist Flags 

引數

Flags

指定要校驗的記憶體。目前只實現了下面這一個值:

Bit 0 (0x1)

校驗零頁面列表(zeroed pages list)。

DLL

Windows NT 4.0

Kdexts.dll

Windows 2000

Kdexts.dll

Windows XP和之後

Kdexts.dll

 

註釋

目前,該擴充套件命令只檢查零頁面列表(zeroed pages list )來確認是否該列表中所有頁面都被用0填充了。使用的語法如下:

kd> !memlist 1

!memusage

!memusage 擴充套件顯示實體記憶體使用的摘要統計。

語法

Windows 2000和之後的語法

!memusage 

Windows XP和之後的語法

!memusage [Flags]

Flags

(Windows XP和之後) 可以是下面這些值的任意一個。預設為0x0。

0x0

顯示一般摘要資訊,以及對PFN資料庫中的頁面更詳細一些的說明。檢視註釋節獲得這種輸出的示例。

0x1

僅顯示PFN資料庫中已修改的非寫頁面(no-write page)的摘要資訊。

0x2

僅顯示PFN資料庫中已修改的非寫頁面(no-write page)的詳細資訊。

0x8

僅顯示記憶體使用的一般摘要資訊。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

實體記憶體統計是由記憶體管理器(Memory Manager)的頁面幀序號(PFN)資料庫蒐集的。

由於需要獲取大量資料,該命令需要執行較長時間,特別是當目標機執行在64位模式時。載入PFN資料庫時,會由一個計數器來顯示進度。要加快這種載入,可以通過CTRL+A (Toggle Baud Rate) 鍵增加COM口的速度,或者使用, .cache (Set
Cache Size)
 命令增加快取大小(可能大約在10 MB左右)。

!memusage 命令也可以在本地核心除錯時使用。

下面是該命令輸出的一個例子:

kd> !memusage
 loading PFN database
loading (98% complete)

Compiling memory usage data (100% Complete).
             Zeroed:     49 (   196 kb)
               Free:      5 (    20 kb)
            Standby:   5489 ( 21956 kb)
           Modified:    714 (  2856 kb)
    ModifiedNoWrite:      1 (     4 kb)
       Active/Valid:  10119 ( 40476 kb)
         Transition:      6 (    24 kb)
            Unknown:      0 (     0 kb)
              TOTAL:  16383 ( 65532 kb)

  Building kernel map
  Finished building kernel map
Scanning PFN database – (99% complete) 

  Usage Summary (in Kb):

Control Valid Standby Dirty Shared Locked PageTables  name

8251a258    12    108     0     0     0     0  mapped_file( cscui.dll )
827ab1b8     8   1708     0     0     0     0  mapped_file( $Mft )
8263c408   908     48     0     0     0     0  mapped_file( win32k.sys )
8252dda8     0    324     0     0     0     0  mapped_file( ShellIconCache )
8272f638   128    112     0   116     0     0  mapped_file( advapi32.dll )
……
82755958     0      4     0     0     0     0  mapped_file( $Directory )
8250b518     0      4     0     0     0     0    No Name for File
8254d8d8     0      4     0     0     0     0  mapped_file( $Directory )
82537be8     0      4     0     0     0     0  mapped_file( Windows Explorer.lnk )

——–  1348      0     0 —– —–   904  process ( System )
——–   492      0     0 —– —–    72  process ( winmine.exe )
——–  3364   1384  1396 —– —–   188  process ( explorer.exe )
——–   972      0     0 —– —–    88  process ( services.exe )
——–   496   1456   384 —– —–   164  process ( winmgmt.exe )
——–  1144      0     0 —– —–   120  process ( svchost.exe )
——–   944      0     0 —– —–   156  process ( winlogon.exe )
——–   412      0     0 —– —–    64  process ( csrss.exe )
……
——–    12      0     0 —– —–     8  process ( wmiadap.exe )

——–   316      0     0 —– —–     0  pagefile section (346e)
——–  4096      0     0 —– —–     0  pagefile section (9ad)

——–   884    280    36 —–     0 —–  driver ( ntoskrnl.exe )
——–    88      8     0 —–     0 —–  driver ( hal.dll )
——–     8      0     0 —–     0 —–  driver ( kdcom.dll )
——–    12      0     0 —–     0 —–  driver ( BOOTVID.dll )
……
——–     8      0     0 —–     0 —–  driver ( ndisuio.sys )
——–    16      0     0 —–     0 —–  driver ( dump_scsiport.sys )
——–    56      0     0 —–     0 —–  driver ( dump_aic78xx.sys )
——–  2756   1060   876 —–     0 —–  driver ( Paged Pool )
——–  1936    128   148 —–     0 —–  driver ( Kernel Stacks )
——–     0      0     0 —–     0 —–  driver ( NonPaged Pool )

第一列顯示用來描述每個已對映結構(mapped structure)的控制域結構(control area structure)地址。使用!ca 擴充套件命令可以顯示這些控制域。

註釋

使用 !vm 擴充套件命令可以分析虛擬記憶體使用。該命令一般比!memusage要更有用些。關於記憶體管理的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!pfn 擴充套件命令可以用來檢視PFN資料庫中某個特定頁面幀。

!mps

!mps 擴充套件顯示目標機中Intel 多處理器規範(Multiprocessor Specification (MPS))的BIOS資訊。

語法

!mps [Address

引數

Address

指定BIOS中MPS表的16進位制地址。如果省略,則從HAL中獲取該資訊。這需要HAL的符號。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件命令僅對x86目標機使用。

附加資訊

關於BIOS除錯的更多資訊,檢視除錯BIOS程式碼。關於MPS的資訊,檢視Intel MultiProcessor Specification的適當版本。

!mtrr

!mtrr 擴充套件顯示MTRR暫存器的內容。

語法

!mtrr 

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件命令只能用於x86目標機。

!npx

!npx 擴充套件顯示浮點暫存器儲存區域(floating-point register save area)的內容。

語法

!npx Address 

引數

Address

指定FLOATING_SAVE_AREA 結構的16進位制地址。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

該擴充套件命令只能用於x86目標機。

!ob, !od, !ow

!ob、 !od、以及!ow 擴充套件命令已廢除。使用ob, od, ow (Output to Port) 命令來替代。

!object

!object 擴充套件顯示某個系統物件。

語法

Windows NT 4.0的語法

!object Address 
!object 0 Name 
!object \ 

Windows 2000和之後的語法

!object Address 
!object 0 Name 
!object Path 
!object -r 

引數

Address

如果第一個引數是非0的16進位制數字,則指定要顯示資訊的系統物件的16進位制地址。

Name

如果第一個引數為0,則第二個引數是要顯示所有例項的系統物件型別的名字。

Path

如果第一個引數以反斜線開頭 (\), !object 將它當作一個物件路徑的名字(object path name)。使用該選項時,會根據物件管理器(Object Manager)的目錄結構來進行顯示。

\

(僅Windows NT 4.0) 指定根目錄物件(root directory object)。

-r

(Windows 2000 和之後) 使得被快取的全域性變數的值被重新整理。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

!object 擴充套件會快取一些值能夠被改變的特定的全域性變數。如果使用的核心符號已經過期,可以使用!object –r來重新整理快取的值。

下面的例子用!handle 擴充套件來獲得物件指標:

kd> !handle
processor number 0
PROCESS 80a02920  Cid: 0002    Peb: 00000000  ParentCid: 0000
    DirBase: 0006c805  ObjectTable: 80a03788  TableSize:  54.
    Image: System
006c: Object: 80967768  GrantedAccess: 00100003
Object: 80967768  Type: (809d5c20) File
    ObjectHeader: 80967750
        HandleCount: 1  PointerCount: 1
        Directory Object: 00000000  Name: \WINNT\system32\config\software {Partition1}

kd> !object 80967768
Object: 80967768  Type: (809d5c20) File
    ObjectHeader: 80967750
    HandleCount: 1  PointerCount: 1
    Directory Object: 00000000  Name: \WINNT\system32\config\software {Partition1}

附加資訊

關於物件和物件管理器的資訊,檢視Microsoft Windows SDK文件、Windows Driver Kit (WDK)文件、以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!obtrace

!obtrace 擴充套件顯示指定物件的物件引用資料。

語法

!obtrace Object 

引數

Object

指向物件的指標或者路徑。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

Windows的物件引用跟蹤功能會在每次物件的引用計數增加或者減少時記錄呼叫堆疊。

使用該擴充套件命令來顯示物件引用跟蹤資料前,必須用GFlags來對指定的物件啟用物件引用跟蹤(object reference tracing) 。可以通過核心標誌(執行時)設定來啟用物件引用跟蹤,這種改變會立即生效,但是關閉或重起之後消失;也可以通過登錄檔設定,這種設定需要重起,但是如果沒有改變的話會一直保持下去。

下面是!obtrace 擴充套件的輸出示例:

kd> !obtrace 0xfa96f700
Object: fa96f700        Image: cmd.exe
Sequence  (+/-)  Stack
——–  —–  —————————————————
   2421d    +1  nt!ObCreateObject+180
                nt!NtCreateEvent+92
                nt!KiFastCallEntry+104
                nt!ZwCreateEvent+11
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   2421e    -1  nt!ObfDereferenceObject+19
                nt!NtCreateEvent+d4
                nt!KiFastCallEntry+104
                nt!ZwCreateEvent+11
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   2421f    +1  nt!ObReferenceObjectByHandle+1c3
                win32k!xxxCreateThreadInfo+37d
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   24220    +1  nt!ObReferenceObjectByHandle+1c3
                win32k!ProtectHandle+22
                win32k!xxxCreateThreadInfo+3a0
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

   24221    -1  nt!ObfDereferenceObject+19
                win32k!xxxCreateThreadInfo+3a0
                win32k!UserThreadCallout+6f
                win32k!W32pThreadCallout+38
                nt!PsConvertToGuiThread+174
                nt!KiBBTUnexpectedRange+c

—-  ———————————————————-
References: 3, Dereferences 2

!obtrace 0xfa96f700顯示出來的主要指示符在下表中列出。

引數

意義

Sequence

表示操作的順序。

+/-

表示引用或者取消引用的操作。

+1表示一次引用操作。

-1表示一次取消引用操作。

+/-n 表示多次的引用/取消引用操作。

 

在x64目標機上的物件引用跟蹤可能不完全,因為在IRQL高於PASSIVE_LEVEL 的時候並不一定能夠取到呼叫堆疊。

任何時候可以通過按下CTRL+BREAK (WinDbg) 或CTRL+C (KD)中止命令。

附加資訊

關於全域性標誌實用工具(GFlags)的更多資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!openmaps

!openmaps 擴充套件顯示指定的共享快取對映(shared cache map)的引用緩衝區控制塊(referenced buffer control blocks (BCBs)),和虛擬地址控制塊(virtual address control blocks (VACBs))。

語法

!openmaps Address [Flag

引數

Address

指定共享快取對映的地址。

Flag

指定要顯示哪個控制塊。如果Flag1,偵錯程式顯示所有控制塊。如果Flag0,偵錯程式僅顯示引用控制塊 (referenced control blocks)。預設值為0

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

附加資訊

關於快取管理的資訊,檢視Microsoft Windows SDK文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

關於其他快取管理擴充套件命令的資訊,檢視!cchelp 擴充套件。

WinDbg 文件翻譯—-81

cc682/NetRoc

http://netroc682.spaces.live.com/

!job

!job 擴充套件用來顯示一個作業(job)物件。

語法

!job [Process [Flags]] 

引數

Process

指定要檢視的job物件所關聯的程序或者執行緒的16進位制地址。如果省略或者設為-1(Windows 2000中)或者0 (Windows XP和之後),則顯示當前程序關聯的job物件。

Flags

指定顯示中包含的內容。可以是任意下面這些位值的和。預設值為0x1:

Bit 0 (0x1)

顯示job的設定和統計。

Bit 1 (0x2)

顯示job中所有程序的列表。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

 

註釋

下面是該擴充套件輸出的示例:

kd> !process 52c
Searching for Process with Cid == 52c
PROCESS 8276c550  SessionId: 0  Cid: 052c    Peb: 7ffdf000  ParentCid: 0060
    DirBase: 01289000  ObjectTable: 825f0368  TableSize:  24.
    Image: cmd.exe
    VadRoot 825609e8 Vads 30 Clone 0 Private 77. Modified 0. Locked 0.
    DeviceMap e1733f38
    Token                             e1681610
    ElapsedTime                       0:00:12.0949
    UserTime                          0:00:00.0359
    …..
    CommitCharge                      109
    Job                               8256e1f0

kd> !job 8256e1f0
Job at ffffffff8256e1f0
  TotalPageFaultCount      0
  TotalProcesses           1
  ActiveProcesses          1
  TotalterminatedProcesses 0
  LimitFlags               0
  MinimumWorkingSetSize    0
  MaximumWorkingSetSize    0
  ActiveProcessLimit       0
  PriorityClass            0
  UIRestrictionsClass      0
  SecurityLimitFlags       0
  Token                    00000000

附加資訊

關於job物件的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!kb, !kv

!kb 和!kv 擴充套件命令已經廢除。使用kb (Display Stack Backtrace) 和kv
(Display Stack Backtrace)
 命令來替代。

!loadermemorylist

!loadermemorylist 擴充套件顯示Windows boot loader傳遞給Windows的記憶體分配列表。

語法

!loadermemorylist ListHeadAddress 

引數

ListHeadAddress

指定列表頭的地址。

DLL

Windows NT 4.0

Kdexts.dll

Windows 2000

Kdexts.dll

Windows XP
Windows Server 2003

Kdexts.dll

Windows Vista和之後

Kdexts.dll

註釋

該擴充套件是設計在Ntldr正在執行的系統引導早期使用的。它會在記憶體分配列表中顯示開始位置、結束為止和每個頁範圍的型別。

任何時候按下CTRL+BREAK (WinDbg) 或CTRL+C (KD)都可以中斷命令的執行。

!lockedpages

!lockedpages 擴充套件在Windows 2000中顯示當前程序的driver-locked page,在Windows XP和之後的系統中顯示指定程序的driver-locked page。

語法

Windows 2000的語法

!lockedpages 

Windows XP和之後的語法

!lockedpages [Process

引數

Process

(僅Windows XP和之後) 指定某個程序。如果省略Process,則使用當前程序。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

任何時候按下CTRL+BREAK (WinDbg) 或CTRL+C (KD)都可以中斷命令的執行。

!locks (!kdext*.locks)

Kdextx86.dll 和Kdexts.dll中的!locks 擴充套件命令顯示核心ERESOURCE 鎖的資訊。

該命令不要和!ntsdexts.locks 擴充套件命令混淆。

語法

!locks [Options] [Address

引數

Options

指定要顯示的資訊數量。可以是下面這些選項的任意組合:

-v

顯示每個鎖的詳細資訊。

-p

顯示鎖的所有可能的資訊,包括效能統計。

-d

顯示所有鎖的資訊。否則只顯示出現爭用的鎖。

Address

指定要顯示的ERESOURCE 鎖的16進位制地址。如果Address為0或者省略,則顯示系統中所有ERESOURCE 鎖。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

!locks 擴充套件顯示執行緒為資源而持有的所有的鎖。鎖可以是共享的(shared)或者獨佔的(exclusive),獨佔意味著其它執行緒不能訪問該資源。當系統發生死鎖時這個資訊很有用。死鎖是由於某個非執行的執行緒持有了某個資源的獨佔鎖,但是其它執行的執行緒又需要這個所的時候會發生。

在Microsoft Windows 2000中通常可以通過查詢非執行執行緒持有了某個執行執行緒請求的某個資源的獨佔鎖的情況,來定位死鎖。大多數的鎖都是共享的。

下面是基本的!locks 輸出的示例:

kd> !locks
**** DUMP OF ALL RESOURCE OBJECTS ****
KD: Scanning for held locks……

Resource @ 0x80e97620    Shared 4 owning threads
     Threads: ff688da0-01<*> ff687da0-01<*> ff686da0-01<*> ff685da0-01<*> 
KD: Scanning for held locks……………………………………………….

Resource @ 0x80e23f38    Shared 1 owning threads
     Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
KD: Scanning for held locks.

Resource @ 0x80d8b0b0    Shared 1 owning threads
     Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
2263 total locks, 3 locks currently held

注意顯示出來的每個執行緒的地址後面都跟有執行緒計數 (例如"-01")。如果某個執行緒後跟有 I "<*>",則該執行緒是鎖的所有者。有些情況下,初始執行緒的地址會包含一個偏移。這種情況下,實際的執行緒地址也會顯示出來。

如果想檢視這些資源物件中某一個的更多資訊,可以將"Resource @"後的地址作為其它命令的引數。要檢視上面例子中的第二個資源,可以使用dt ERESOURCE 80d8b0b0 或者 !thread 80ed0020。或者也可以帶-v選項再次使用!locks

kd> !locks -v 80d8b0b0

Resource @ 0x80d8b0b0    Shared 1 owning threads
     Threads: 80ed0023-01<*> *** Actual Thread 80ed0020

     THREAD 80ed0020  Cid 4.2c  Teb: 00000000 Win32Thread: 00000000 WAIT: (WrQueue) KernelMode Non-Alertable
         8055e100  Unknown
     Not impersonating
GetUlongFromAddress: unable to read from 00000000
     Owning Process 80ed5238
     WaitTime (ticks)          44294977
     Context Switch Count      147830             
     UserTime                  0:00:00.0000
     KernelTime                0:00:02.0143
     Start Address nt!ExpWorkerThread (0x80506aa2)
     Stack Init fafa4000 Current fafa3d18 Base fafa4000 Limit fafa1000 Call 0
     Priority 13 BasePriority 13 PriorityDecrement 0
ChildEBP RetAddr  
fafa3d30 804fe997 nt!KiSwapContext+0x25 (FPO: [EBP 0xfafa3d48] [0,0,4]) [D:\NT\base\ntos\ke\i386\ctxswap.asm @ 139]
fafa3d48 80506a17 nt!KiSwapThread+0x85 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\nt\base\ntos\ke\thredsup.c @ 1960]
fafa3d78 80506b36 nt!KeRemoveQueue+0x24c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ke\queueobj.c @ 542]
fafa3dac 805ad8bb nt!ExpWorkerThread+0xc6 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ex\worker.c @ 1130]
fafa3ddc 8050ec72 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ps\create.c @ 2164]
00000000 00000000 nt!KiThreadStartup+0x16 [D:\NT\base\ntos\ke\i386\threadbg.asm @ 81]

1 total locks, 1 locks currently held

!logonsession

!logonsession 擴充套件顯示指定的登陸會話(logon session)的資訊。

語法

Free Build 語法

!logonsession LUID 

Checked Build語法

!logonsession LUID [InfoLevel

引數

LUID

指定要顯示的登陸會話的區域性唯一識別符號(LUID)。 如果LUID為0,則顯示所有登陸會話的資訊。

要在check版中顯示系統會話和所有系統令牌(system token),輸入!logonsession 3e7 1

InfoLevel

(僅Checked Build) 指定要顯示多少令牌資訊(token information)。InfoLevel 引數可以是0到4之間的值,0表示最少的資訊,4表示最多。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

下面是該擴充套件命令在free build上的輸出示例:

kd> !logonsession 0

Dumping all logon sessions.

** Session   0 = 0x0
   LogonId     = {0x0 0x0}
   References  = 0
** Session   1 = 0x8ebb50
   LogonId     = {0xe9f1 0x0}
   References  = 21
** Session   2 = 0x6e31e0
   LogonId     = {0x94d1 0x0}
   References  = 1
** Session   3 = 0x8ecd60
   LogonId     = {0x6b31 0x0}
   References  = 0
** Session   4 = 0xe0000106
   LogonId     = {0x0 0x0}
   References  = 0
** Session   5 = 0x0
   LogonId     = {0x0 0x0}
   References  = 0
** Session   6 = 0x8e9720
   LogonId     = {0x3e4 0x0}
   References  = 6
** Session   7 = 0xe0000106
   LogonId     = {0x0 0x0}
   References  = 0
** Session   8 = 0xa2e160
   LogonId     = {0x3e5 0x0}
   References  = 3
** Session   9 = 0xe0000106
   LogonId     = {0x0 0x0}
   References  = 0
** Session  10 = 0x3ca0
   LogonId     = {0x3e6 0x0}
   References  = 2
** Session  11 = 0xe0000106
   LogonId     = {0x0 0x0}
   References  = 0
** Session  12 = 0x1cd0
   LogonId     = {0x3e7 0x0}
   References  = 33
** Session  13 = 0xe0000106
   LogonId     = {0x0 0x0}
   References  = 0
14 sessions in the system.

任何時候都可以通過按下CTRL+BREAK (WinDbg) 或CTRL+C (KD)來中止命令執行。

附加資訊

關於登陸會話的資訊,檢視Microsoft Windows SDK 文件和Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!lookaside

!lookaside 擴充套件可以顯示look-aside lists的資訊、重置look-aside list的計數器、或者改變look-aside list的深度。

語法

!lookaside [Address [Options [Depth]]] 

引數

Address

指定要使用的look-aside lists的16進位制地址。如果Address為0或者省略,則顯示所有的系統look-aside list。

Options

控制要進行的操作。支援下面這些可能的Options 。預設值為0:

0

顯示指定的look-aside list 的資訊。 (如果Address為0,則顯示所有系統look-aside list。)

1

重置指定look-aside list的計數器。(僅Windows NT 4.0:如果Address 為0,則重置所有small pool look-aside list。)

2

改變指定look-aside list 的深度。該選項只有在Address 非0時可以使用。

Depth

設定給定的look-aside list的最大深度。該引數僅在Addres非0,並且Options 等於 2時可用。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

Look-aside list是一種用於管理固定大小的分頁或非分頁記憶體池的多處理器安全的機制。

由於在大多數平臺上都不使用自旋鎖(spin lock),所以look-aside list是高效的。

注意如果look-aside list的當前深度大於它的最大深度,則釋放關聯到該list的結構時會釋放到池記憶體中,而不是釋放到list記憶體中。

下面是該擴充套件的輸出示例:

kd> !lookaside e0000165f7621800

Lookaside "" @ e0000165f7621800 "Ntfs"
    Type     =     0011 PagedPool RaiseIfAllocationFailure
    Current Depth  =        0   Max Depth  =        4
    Size           =      488   Max Alloc  =     1952
    AllocateMisses =        3   FreeMisses =        0
    TotalAllocates =        4   TotalFrees =        4
    Hit Rate       =       25%  Hit Rate   =      100%

附加資訊

關於look-aside list的資訊,檢視Windows Driver Kit (WDK) 文件,以及 Mark Russinovich 和David Solomon編寫的Microsoft Windows Internals

!lpc

!lpc 擴充套件顯示目標系統中的本地過程呼叫(local procedure call (LPC))埠和資訊。

語法

Windows NT 4.0的語法

!lpc 

Windows 2000的語法

!lpc message MessageID 
!lpc port Port 
!lpc scan Port 
!lpc thread Thread 
!lpc 

Windows Server 2003 和Windows XP的語法

!lpc message MessageID 
!lpc port Port 
!lpc scan Port 
!lpc thread Thread 
!lpc PoolSearch 
!lpc
 

引數

message

(僅Windows Server 2003、Windows XP、和Windows 2000) 如果有的話,顯示某條訊息的資訊,例如佇列中包含該訊息的伺服器埠(server port)、等待該訊息的執行緒。

MessageID

(僅Windows Server 2003、Windows XP、和Windows 2000) 指定要顯示的訊息的訊息ID。如果該引數的值為0或者省略,!lpc message 命令顯示訊息的摘要列表。(在Windows 2000 Service Pack 1 (SP1)中,摘要包括LPC zone 的所有訊息。在Windows 2000 Service Pack 2 (SP2)、 Windows XP和之後版本的Windows中,摘要包括系統池中的所有訊息。已經被頁換出得訊息不會包含。)

port

(僅Windows Server 2003、Windows XP、和Windows 2000) 顯示埠資訊,如埠的名字、訊號量狀態、佇列中的訊息、裁剪佇列(rundown queue)中的執行緒、控制代碼數量、引用、以及相關的埠。

scan

(僅Windows Server 2003、Windows XP、和Windows 2000) 顯示指定埠以及連線到它的所有埠的摘要資訊。

Port

(僅Windows Server 2003、Windows XP、和Windows 2000) 指定要顯示的埠的16進位制地址。如果使用!lpc port 命令,並且 Port 為0或省略,則顯示所由LPC埠的摘要列表。如果使用!lpc scan 命令,Port 必須指定一個實際的埠地址。

thread

(僅Windows Server 2003、Windows XP、和Windows 2000) 顯示在rundown port queue中包含指定執行緒的所有埠的資訊。

Thread

(僅Windows Server 2003、Windows XP、和Windows 2000) 指定執行緒的16進位制地址。如果為0或者省略,!lpc thread命令顯示所有正在進行LPC操作的執行緒的摘要列表。

PoolSearch

(僅Windows Server 2003、Windows XP、和Windows 2000) 指定!lpc message命令是否在核心池(kernel pool)中搜尋訊息。每次使用!lpc PoolSearch時,該設定會在開啟和關閉之間切換(初始設定是不搜尋核心池)。它僅作用於MessageID指定為非0值的!lpc message命令。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP
Windows Server 2003

Kdexts.dll

註釋

該擴充套件在Windows Vista和之後版本的Windows中不支援。

在Windows NT 4.0,不帶引數使用 !lpc 會顯示目標機上所有LPC埠和訊息,類似在Windows 2000和之後系統中使用!lpc port 然後使用 !lpc message

在Windows Server 2003、Windows XP和Windows 2000中,不帶引數使用!lpc 會在偵錯程式命令視窗中顯示該擴充套件命令的幫助文字。

如果有某個執行緒被標記為在等待某條訊息返回,可以使用!lpc message 命令和這條延遲的訊息的ID。命令會顯示該訊息、包含它的埠、以及所有被延遲的執行緒。

如果找不到訊息,並且沒有讀取錯誤(例如"Unable to access zone segment"),則伺服器已經接收到了這條訊息。

這種情況下,伺服器埠一般可以通過!lpc thread命令找到。等待響應的執行緒連線到伺服器通訊佇列(server communication queue)上。這條命令可以顯示所有包含指定執行緒的埠。知道了埠地址之後,可以使用!lpc port 命令。通過使用!lpc thread 命令和執行緒地址,可以獲得關於每條執行緒的更多資訊。

下面是擴充套件命令在Windows XP系統上的輸出示例:

這個例子中,顯示了所有LPC埠。

kd> !lpc port
Scanning 225 objects
       1  Port: 0xe1405650 Connection: 0xe1405650  Communication: 0x00000000  ‘SeRmCommandPort’ 
       1  Port: 0xe141ef50 Connection: 0xe141ef50  Communication: 0x00000000  ‘SmApiPort’ 
       1  Port: 0xe13c5740 Connection: 0xe13c5740  Communication: 0x00000000  ‘ApiPort’ 
       1  Port: 0xe13d9550 Connection: 0xe13d9550  Communication: 0x00000000  ‘SbApiPort’ 
       3  Port: 0xe13d8830 Connection: 0xe141ef50  Communication: 0xe13d8910  ” 
80000004  Port: 0xe13d8910 Connection: 0xe141ef50  Communication: 0xe13d8830  ” 
       3  Port: 0xe13d8750 Connection: 0xe13d9550  Communication: 0xe13a4030  ” 
       …..

上面例子中,地址e14ae238 處的埠沒有訊息,即所有訊息都已經被接收並且沒有新訊息到達。

kd> !lpc port e14ae238

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty

上面例子中,0xe14ae238 處的埠有已排隊但是還沒有被伺服器接收的訊息。

kd> !lpc port 0xe14ae238

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 108
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
        Messages in queue:
        0000 e20d9b80 – Busy  Id=0002249c  From: 0584.0680  Context=00000021  [e14ae248 . e14ae248]
                   Length=0098007c  Type=00000001 (LPC_REQUEST)
                   Data: 00000000 0002021e 00000584 00000680 002f0001 00000007
    The message queue contains 1 messages
    The LpcDataInfoChainHead queue is empty

剩下的這些Windows XP上的示例是關於可以在這條擴充套件命令中使用的其它選項的。

kd> !lpc message 222be
Searching message 222be in threads …
Client thread 842a4db0 waiting a reply from 222be
Searching thread 842a4db0 in port rundown queues …

Server communication port 0xe114a3c0
    Handles: 1   References: 1
    The LpcDataInfoChainHead queue is empty
        Connected port: 0xe1e7b948      Server connection port: 0xe14ae238

Client communication port 0xe1e7b948
    Handles: 1   References: 3
    The LpcDataInfoChainHead queue is empty

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty
Done.

kd> !lpc thread 842a4db0
Searching thread 842a4db0 in port rundown queues …

Server communication port 0xe114a3c0
    Handles: 1   References: 1
    The LpcDataInfoChainHead queue is empty
        Connected port: 0xe1e7b948      Server connection port: 0xe14ae238

Client communication port 0xe1e7b948
    Handles: 1   References: 3
    The LpcDataInfoChainHead queue is empty

Server connection port e14ae238  Name: ApiPort
    Handles: 1   References: 107
    Server process  : 84aa0140 (csrss.exe)
    Queue semaphore : 84a96da8
    Semaphore state 0 (0x0)
    The message queue is empty
    The LpcDataInfoChainHead queue is empty

kd> !lpc scan e13d8830
Scanning 225 objects
       3  Port: 0xe13d8830 Connection: 0xe141ef50  Communication: 0xe13d8910  ” 
80000004  Port: 0xe13d8910 Connection: 0xe141ef50  Communication: 0xe13d8830  ” 
Scanning 3 objects

下面是在Windows NT 4.0系統上的輸出示例:

kd> !lpc
Scanning 2 objects of type ‘Port’
Connection Port Object at e11b8bc0 – Name=’\SmApiPort’ created by smss.exe
Connection Port Object at e11ba040 – Name=’\SeRmCommandPort’ created by System

附加資訊

關於LPC的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

7月22日

WinDbg 文件翻譯—-80

cc682/NetRoc

http://netroc682.spaces.live.com/

!iovirp

!iovirp 擴充套件顯示指定的I/O Verifier IRP 的詳細資訊。

語法

!iovirp [IRP

引數

IRP

指定被驅動程式驗證器(Driver Verifier)跟蹤的IRP的地址。如果IRP 為0或省略,則顯示每個未完成IRP的摘要資訊。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

下面是該擴充套件輸出的示例:

kd> !iovirp 947cef68
IovPacket       84509af0
TrackedIrp      947cef68
HeaderLock      84509d61
LockIrql        0
ReferenceCount  1
PointerCount    1
HeaderFlags     00000000
ChainHead       84509af0
Flags           00200009
DepartureIrql   0
ArrivalIrql     0
StackCount      1
QuotaCharge     00000000
QuotaProcess    0
RealIrpCompletionRoutine        0
RealIrpControl                  0
RealIrpContext                  0
TopStackLocation        2
PriorityBoost           0
LastLocation            0
RefTrackingCount        0
SystemDestVA            0
VerifierSettings        84509d08
pIovSessionData         84509380
Allocation Stack:
  nt!IovAllocateIrp+1a  (817df356)
  nt!IopXxxControlFile+40c  (8162de20)
  nt!NtDeviceIoControlFile+2a  (81633090)
  nt!KiFastCallEntry+164  (81513c64)
  nt!EtwpFlushBuffer+10f  (817606d7)
  nt!EtwpFlushBuffersWithMarker+bd  (817608cb)
  nt!EtwpFlushActiveBuffers+2b4  (81760bc2)
  nt!EtwpLogger+213  (8176036f)

任何時候通過按下CTRL+BREAK (WinDbg) 或者CTRL+C (KD)都可以中止命令。

!ipi

!ipi 擴充套件顯示指定處理器的跨處理器中斷(interprocessor interrupt (IPI))狀態。

語法

!ipi [Processor]

引數

Processor

指定一個處理器。如果省略Processor,則顯示所有處理器的 IPI 狀態。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該擴充套件只能對x86目標機使用。

註釋

下面是命令輸出的示例:

0: kd> !ipi
IPI State for Processor 0
  Worker Routine:  nt!KiFlushTargetMultipleTb [Stale]
  Parameter[0]:    0
  Parameter[1]:    3
  Parameter[2]:    F7C98770
  Ipi Trap Frame:  F7CCCCDC [.trap F7CCCCDC]
  Signal Done:     0
  IPI Frozen:      24 [FreezeActive] [Owner]
  Request Summary: 0
  Target Set:      0
  Packet Barrier:  0

IPI State for Processor 1
  Worker Routine:  nt!KiFlushTargetMultipleTb [Stale]
  Parameter[0]:    1
  Parameter[1]:    3
  Parameter[2]:    F7CDCD28
  Ipi Trap Frame:  F7C8CCC4 [.trap F7C8CCC4]
  Signal Done:     0
  IPI Frozen:      2 [Frozen]
  Request Summary: 0
  Target Set:      0
  Packet Barrier:  0

附加資訊

關於IPI的資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!irp

!irp 擴充套件顯示某個I/O請求包(IRP)的資訊。

語法

!irp Address [Detail

引數

Address

指定IRP的16進位制地址。

Detail

如果該引數包含了任何值,例如1,則輸出重包含IRP的狀態、記憶體描述符表(memory descriptor list (MDL))的地址、擁有者執行緒、它的所有I/O棧的堆疊資訊、以及每個IRP堆疊位置的資訊,包括主功能程式碼(major function code)和次功能程式碼(minor function code)的16進位制數值。如果省略該引數,則只顯示摘要資訊。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面這些資訊有助於理解該擴充套件命令輸出的內容。

IRP 主功能程式碼有下面這些:

Major Function Code

16進位制程式碼

IRP_MJ_Create

0x00

IRP_MJ_Create_NAMED_PIPE

0x01

IRP_MJ_CLOSE

0x02

IRP_MJ_READ

0x03

IRP_MJ_WRITE

0x04

IRP_MJ_QUERY_INFORMATION

0x05

IRP_MJ_SET_INFORMATION

0x06

IRP_MJ_QUERY_EA

0x07

IRP_MJ_SET_EA

0x08

IRP_MJ_FLUSH_BUFFERS

0x09

IRP_MJ_QUERY_VOLUME_INFORMATION

0x0A

IRP_MJ_SET_VOLUME_INFORMATION

0x0B

IRP_MJ_DIRECTORY_CONTROL

0x0C

IRP_MJ_FILE_SYSTEM_CONTROL

0x0D

IRP_MJ_DEVICE_CONTROL

0x0E

IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_SCSI

0x0F

IRP_MJ_SHUTDOWN

0x10

IRP_MJ_LOCK_CONTROL

0x11

IRP_MJ_CLEANUP

0x12

IRP_MJ_Create_MAILSLOT

0x13

IRP_MJ_QUERY_SECURITY

0x14

IRP_MJ_SET_SECURITY

0x15

IRP_MJ_POWER

0x16

IRP_MJ_SYSTEM_CONTROL

0x17

IRP_MJ_DEVICE_CHANGE

0x18

IRP_MJ_QUERY_QUOTA

0x19

IRP_MJ_SET_QUOTA

0x1A

IRP_MJ_PNP
IRP_MJ_MAXIMUM_FUNCTION

0x1B

 

即插即用(Plug and Play) 次功能程式碼有下面這些:

Minor Function Code

16進位制程式碼

IRP_MN_START_DEVICE

0x00

IRP_MN_QUERY_REMOVE_DEVICE

0x01

IRP_MN_REMOVE_DEVICE

0x02

IRP_MN_CANCEL_REMOVE_DEVICE

0x03

IRP_MN_STOP_DEVICE

0x04

IRP_MN_QUERY_STOP_DEVICE

0x05

IRP_MN_CANCEL_STOP_DEVICE

0x06

IRP_MN_QUERY_DEVICE_RELATIONS

0x07

IRP_MN_QUERY_INTERFACE

0x08

IRP_MN_QUERY_CAPABILITIES

0x09

IRP_MN_QUERY_RESOURCES

0x0A

IRP_MN_QUERY_RESOURCE_REQUIREMENTS

0x0B

IRP_MN_QUERY_DEVICE_TEXT

0x0C

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

0x0D

IRP_MN_READ_CONFIG

0x0F

IRP_MN_WRITE_CONFIG

0x10

IRP_MN_EJECT

0x11

IRP_MN_SET_LOCK

0x12

IRP_MN_QUERY_ID

0x13

IRP_MN_QUERY_PNP_DEVICE_STATE

0x14

IRP_MN_QUERY_BUS_INFORMATION

0x15

IRP_MN_DEVICE_USAGE_NOTIFICATION

0x16

IRP_MN_SURPRISE_REMOVAL

0x17

IRP_MN_QUERY_LEGACY_BUS_INFORMATION

0x18

 

WMI次功能程式碼有:

Minor Function Code

16進位制程式碼

IRP_MN_QUERY_ALL_DATA

0x00

IRP_MN_QUERY_SINGLE_INSTANCE

0x01

IRP_MN_CHANGE_SINGLE_INSTANCE

0x02

IRP_MN_CHANGE_SINGLE_ITEM

0x03

IRP_MN_ENABLE_EVENTS

0x04

IRP_MN_DISABLE_EVENTS

0x05

IRP_MN_ENABLE_COLLECTION

0x06

IRP_MN_DISABLE_COLLECTION

0x07

IRP_MN_REGINFO

0x08

IRP_MN_EXECUTE_METHOD

0x09

 

電源管理的次功能程式碼有:

Minor Function Code

16進位制程式碼

IRP_MN_WAIT_WAKE

0x00

IRP_MN_POWER_SEQUENCE

0x01

IRP_MN_SET_POWER

0x02

IRP_MN_QUERY_POWER

0x03

 

SCSI 次功能程式碼有:

Minor Function Code

16進位制程式碼

IRP_MN_SCSI_CLASS

0x01

 

輸出中還指出了當每個stack location當IRP完成或者stack location被處理時,在什麼情況下完成例程會被呼叫。有三種可能的情況:

Success

表示當IRP以成功程式碼完成時完成例程會被呼叫。

Error

表示當IRP以錯誤程式碼完成時,完成例程會被呼叫 。

Cancel

表示當嘗試cancel該IRP時完成里程會被呼叫。

可能會出現上面三個的任何組合形式,只要滿足其中一種條件,那麼完成例程都會被呼叫。適當的值會在每個stack location資訊的第一行末尾列出,緊跟Completion-Context 之後。

下面是該擴充套件命令在Windows XP上的輸出示例:

!irp 81183468
Irp is active with 2 stacks 2 is current (= 0x811834fc)
 No Mdl Thread 00000000: Irp stack trace.
     Cmd  flg cl Device   File     Completion-Context
 [  0, 0]   0  0 8145f470 00000000 00000000-00000000
                \Driver\E100B
                        Args: 00000000 00000000 00000000 00000000
 [ 16, 2]   0 e1 8145f470 00000000 8047f744-814187a8 Success Error Cancel pending
                \Driver\E100B    ntoskrnl!PopCompleteSystemPowerIrp
                        Args: 00000000 00000000 00000002 00000002

在Windows XP示例的第二個stack location處, 主功能程式碼 是16,說明該IRP是傳送給power stack的。次功能程式碼是2,所以power stack 知道它是一個set 請求。該IRP被pending,並且當它完成時,不管指定的返回值是Success還是Error,ntoskrnl!PopCompleteSystemPowerIrp 都會被呼叫。

下面是該擴充套件命令在Windows Vista上的輸出示例:

0: kd> !irp 0x831f4a00
Irp is active with 8 stacks 5 is current (= 0x831f4b00)
 Mdl = 82b020d8 Thread 8c622118:  Irp stack trace.
     cmd  flg cl Device   File     Completion-Context
 [  0, 0]   0  0 00000000 00000000 00000000-00000000

                        Args: 00000000 00000000 00000000 00000000
 [  0, 0]   0  0 00000000 00000000 00000000-00000000

                        Args: 00000000 00000000 00000000 00000000
 [  0, 0]   0  0 00000000 00000000 00000000-00000000

                        Args: 00000000 00000000 00000000 00000000
 [  0, 0]   0  0 00000000 00000000 00000000-00000000

                        Args: 00000000 00000000 00000000 00000000
>[  3,34]  40 e1 828517a8 00000000 842511e0-00000000 Success Error Cancel pending
               \Driver\disk     partmgr!PmReadWriteCompletion
                        Args: 00007000 00000000 fe084e00 00000004
 [  3, 0]  40 e0 82851450 00000000 842414d4-82956350 Success Error Cancel
               \Driver\PartMgr  volmgr!VmpReadWriteCompletionRoutine
                        Args: 129131bb 000000de fe084e00 00000004
 [  3, 0]   0 e0 82956298 00000000 847eeed0-829e2ba8 Success Error Cancel
               \Driver\volmgr   Ntfs!NtfsMasterIrpSyncCompletionRoutine
                        Args: 00007000 00000000 1bdae400 00000000
 [  3, 0]   0  0 82ac2020 8e879410 00000000-00000000
               \FileSystem\Ntfs
                        Args: 00007000 00000000 00018400 00000000

注意驅動名邊上的完成例程是設定在該stack location上的,並且它是被下一行的驅動設定的。上面的例子中, Ntfs!NtfsMasterIrpSyncCompletionRoutine 是由\FileSystem\Ntfs設定的。 Ntfs!NtfsMasterIrpSyncCompletionRoutine上面的Completion-Context為 847eeed0-829e2ba8,指示了該完成例程的地址以及將會傳遞給Ntfs!NtfsMasterIrpSyncCompletionRoutine的context。從這裡我們可以知道Ntfs!NtfsMasterIrpSyncCompletionRoutine 的地址是847eeed0,將會被傳遞給它的context為 829e2ba8

附加資訊

檢視Plug and Play 除錯以及除錯Interrupt Storms獲得該擴充套件命令的應用。關於IRP的資訊,檢視Windows Driver Kit (WDK)
文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals。關於主功能程式碼和次功能程式碼的更多資訊,檢視Windows Driver Kit (WDK)文件。

!irpfind

!irpfind 顯示當前目標系統中已分配的,或者符合指定搜尋條件的I/O請求包(IRP)的資訊。

語法

Windows NT 4.0的語法

!irpfind [PoolType

Windows 2000的語法

!irpfind [PoolType [RestartAddress [Criteria Data]]] 

Windows XP and later的語法

!irpfind [-v] [PoolType [RestartAddress [Criteria Data]]] 

引數

-v

(Windows XP和之後) 顯示詳細資訊。

PoolType

指定要搜尋的池的型別。可以指定下面這些值:

0

指定非分頁記憶體池(nonpaged memory pool)。這是預設值。

1

指定分頁記憶體池(paged memory pool)。

2

指定特殊池(special pool)。

4

(Windows XP和之後) 指定會話池(session pool)。

4, 5, 6

(僅Windows NT 4.0) 和0, 1, 2一樣,但是顯示詳細資訊。

RestartAddress

指定搜尋開始位置的16進位制地址。這在前面的搜尋提前終止時游泳。預設值為0。

Criteria

指定搜尋條件。只有滿足給定條件的IRP才會顯示出來。

條件

匹配

arg

查詢所有某個stack location具有等於Data的引數的IRP。

device

查詢某個stack location的DeviceObject等於Data 的所有IRP。

fileobject

查詢Irp.Tail.Overlay.OriginalFileObject 等於Data的IRP。

mdlprocess

查詢Irp.MdlAddress.Process 等於Data的IRP。

thread

查詢Irp.Tail.Overlay.Thread 等於Data的IRP。

userevent

查詢 Irp.UserEvent 等於Data的IRP。

 

Data

指定搜尋的匹配項。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面的例子查詢完成時會設定FF9E4F48 使用者事件的,在非分頁池中的IRP:

kd> !irpfind 0 0 userevent ff9e4f48

下面的命令列出所有非分頁池中的IRP:

kd> !irpfind
Searching NonPaged pool (8090c000 : 8131e000) for Tag: Irp
8097c008 Thread 8094d900 current stack belongs to  \Driver\symc810
8097dec8 Thread 8094dda0 current stack belongs to  \FileSystem\Ntfs
809861a8 Thread 8094dda0 current stack belongs to  \Driver\symc810
809864e8 Thread 80951ba0 current stack belongs to  \Driver\Mouclass
80986608 Thread 80951ba0 current stack belongs to  \Driver\Kbdclass
80986728 Thread 8094dda0 current stack belongs to  \Driver\symc810

附加資訊

檢視Plug and Play 除錯獲取該擴充套件命令的應用。關於IRP的更多資訊,檢視Windows Driver Kit (WDK)文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!irpzone

!irpzone 擴充套件命令已經廢除,使用 !irpfind 來替代。

!irql

!irql 擴充套件顯示目標機在偵錯程式中斷之前某個處理器的中斷請求級別(interrupt request level (IRQL))。

語法

!irql [Processor

引數

Processor

指定處理器。輸入處理器號。如果省略該引數,偵錯程式顯示當前處理器的IRQL。

DLL

!irql 擴充套件僅在Windows Server 2003和之後的Windows版本中可用。

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP

不可用

Windows Server 2003和之後

Kdexts.dll

註釋

當目標機中斷到偵錯程式時IRQL會改變,但是偵錯程式中斷之前的IRQL會被儲存下來。!irql 擴充套件會顯示這個被儲存的 IRQL。

類似的,當發生bug check並且建立dump檔案時,dump檔案中會儲存bug check之前的IRQL,而不是KeBugCheckEx 例程執行時的。

兩種情況下,除了x86架構上之外,當前IRQL都會被提升到DISPATCH_LEVEL。因此,如果不止一個這樣的事件發生,那麼顯示出來的IRQL會是DISPATCH_LEVEL,這樣對除錯問題就沒有用處了。

!pcr 擴充套件命令可以在所有Windows版本上顯示當前IRQL,但是當前IRQL一般都是無用的。Bug check或者偵錯程式連線之前的IRQL要更加有用一點,而它只能用!irql顯示出來。

如果指定了非法的處理器號,或者核心被破壞了,偵錯程式會顯示"Cannot get PRCB address"的資訊。

下面是該擴充套件在一個雙處理器的x86計算機上的輸出示例:

kd> !irql 0
Debugger saved IRQL for processor 0x0 — 28 (CLOCK2_LEVEL)

kd> !irql 1
Debugger saved IRQL for processor 0x1 — 0 (LOW_LEVEL)

如果偵錯程式在詳細模式(verbose mode)下,則還會顯示IRQL本身的說明。下面是一個在Itanium處理器上的示例 :

kd> !irql
Debugger saved IRQL for processor 0x0 — 12 (PC_LEVEL) [Performance counter level]

IRQL數字的意義通常由處理器決定。這裡是一個x64 處理器的例子。注意IRQL數字和上面的例子一樣,但是該IRQL的含義是不同的:

kd> !irql
Debugger saved IRQL for processor 0x0 — 12 (SYNCH_LEVEL) [Synchronization level]

附加資訊

關於IRQL的資訊,檢視Windows Driver Kit (WDK)文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!isainfo

!isainfo 顯示PNPISA卡或者系統中存在的裝置的資訊。

語法

!isainfo [Card]

引數

Card

指定一個PNPISA卡。如果 Card為0或者省略,則顯示PNPISA (即PC I/O)匯流排上所有裝置和卡。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是該擴充套件輸出的示例:

0: kd> !isainfo
ISA PnP FDO @ 0x867b9938, DevExt @ 0x867b99f0, Bus # 0
Flags (0x80000000)  DF_BUS

  ISA PnP PDO @ 0x867B9818, DevExt @ 0x86595388
  Flags (0x40000818)  DF_ENUMERATED, DF_ACTIVATED, 
                      DF_REQ_TRIMMED, DF_READ_DATA_PORT

!isr

!isr 擴充套件顯示指定地址處的Itanium中斷狀態暫存器(Interruption Status Register (ISR))。

語法

!isr Expression [DisplayLevel]

引數

Expression

指定要顯示的ISR暫存器的16進位制地址。也可以使用@isr表示式作為該引數。這種情況下,顯示當前處理器的ISR暫存器資訊。

DisplayLevel

可以是下面這些選項之一:

0

僅顯示每個ISR欄位的值。這是預設值。

1

顯示非保留和非忽略的ISR欄位的詳細資訊。

2

顯示ISR的所有欄位,包括被忽略或被保留的那些。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該擴充套件命令只能對Itanium目標機使用。

註釋

下面是命令輸出的示例:

kd> !isr @isr
isr:ed ei so ni ir rs sp na r w x vector code
 0  0  0  0  0  0  0  0 0 0 0      0   0

kd> !isr @isr 2

 cod : 0 : interruption Code
 vec : 0 : IA32 exception vector number
  rv : 0 : reserved0
   x : 0 : eXecute exception
   w : 0 : Write exception
   r : 0 : Read exception
  na : 0 : Non-Access exception
  sp : 0 : Speculative load exception
  rs : 0 : Register Stack
  ir : 0 : Invalid Register frame
  ni : 0 : Nested Interruption
  so : 0 : IA32 Supervisor Override
  ei : 0 : Exception IA64 Instruction
  ed : 0 : Exception Deferral
  rv : 0 : reserved1

!ivt

!ivt 擴充套件顯示Itanium中斷向量表(interrupt vector table)。

語法

!ivt [-v] [-a] [Vector
!ivt –? 

引數

Vector

指定當前處理器的中斷向量表條目。如果省略Vector,則顯示目標機當前處理器的整個中斷向量表。如果沒有使用-a選項,那麼未賦值的中斷向量不會顯示出來。

-a

顯示所有中斷向量,包括未賦值的那些。

-v

顯示詳細輸出。

-?

在偵錯程式命令視窗中顯示幫助文字。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該擴充套件命令只能在Itanium目標機上使用。

註釋

下面是命令輸出的示例:

kd> !ivt

Dumping IA64 IVT:

00:e000000083005f60 nt!KiPassiveRelease
0f:e000000083576830 hal!HalpPCIISALine2Pin
10:e0000000830067f0 nt!KiApcInterrupt
20:e000000083006790 nt!KiDispatchInterrupt
30:e000000083576b30 hal!HalpCMCIHandler
31:e000000083576b20 hal!HalpCPEIHandler
41:e000000085039680 i8042prt!I8042KeyboardInterruptService (KINTERRUPT e000000085039620)
51:e000000085039910 i8042prt!I8042MouseInterruptService (KINTERRUPT e0000000850398b0)
61:e0000000854484f0 VIDEOPRT!pVideoPortInterrupt (KINTERRUPT e000000085448490)
71:e0000000856c9450 NDIS!ndisMIsr (KINTERRUPT e0000000856c93f0)
81:e0000000857fd000 SCSIPORT!ScsiPortInterrupt (KINTERRUPT e0000000857fcfa0)
91:e0000000857ff510 atapi!IdePortInterrupt (KINTERRUPT e0000000857ff4b0)
a1:e0000000857d84b0 atapi!IdePortInterrupt (KINTERRUPT e0000000857d8450)
a2:e0000165fff2cab0 portcls!CInterruptSyncServiceRoutine (KINTERRUPT e0000165fff2ca50)
b1:e0000000858c7460 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT e0000000858c7400)
b2:e0000000850382e0 USBPORT!USBPORT_InterruptService (KINTERRUPT e000000085038280)
d0:e0000000835768d0 hal!HalpClockInterrupt
e0:e000000083576850 hal!HalpIpiInterruptHandler
f0:e0000000835769c0 hal!HalpProfileInterrupt
f1:e000000083576830 hal!HalpPCIISALine2Pin
fd:e000000083576b10 hal!HalpMcRzHandler
fe:e000000083576830 hal!HalpPCIISALine2Pin

附加資訊

關於如何顯示x64和x86目標機上的中斷分配表(interrupt dispatch table) ,檢視!idt

WinDbg 文件翻譯—-79

cc682/NetRoc

http://netroc682.spaces.live.com/

!gbl

!gbl 擴充套件顯示目標機的ACPI BIOS 根系統描述表(ACPI BIOS Root System Description (RSDT) table)的頭資訊。

語法

!gbl [-v]

引數

-v

詳細輸出。顯示錶中的詳細資訊。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

 

附加資訊

關於ACPI和ACPI表的更多資訊,檢視其他ACPI除錯擴充套件以及 1ACPI
Specification
站點。也可以檢視Microsoft Windows SDK文件、Windows Driver Kit (WDK)文件、以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!gentable

!gentable 擴充套件顯示某個RTL_GENERIC_TABLE 。

語法

Windows 2000中的語法

!gentable Address 

Windows XP和之後的語法

!gentable Address [Flag

引數

Address

指定RTL_GENERIC_TABLE的地址。

Flag

(Windows XP 和之後) 指定表的來源。如果Flag 是1,則使用AVL表,如果Flag 為0或者省略,則使用non-AVL 表。在Windows 2000中,總是使用non-AVL表。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

!hidppd

!hidppd 擴充套件顯示HIDP_PREPARSED_DATA 結構的內容。

語法

!hidppd Address 

引數

Address

指定HIDP_PREPARSED_DATA 結構的16進位制地址。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

附加資訊

關於human input devices (HID)的資訊,檢視Windows Driver Kit (WDK) 文件。

!ib, !id, !iw

!ib、 !id、和 !iw 命令已經廢除。使用ib, id, iw (Input from Port)命令替代。

!icpleak

!icpleak 擴充套件在系統中查詢佇列中條目個數最大的I/O completion物件。

語法

!icpleak [HandleFlag

引數

HandleFlag

如果設定了該標誌,則還會顯示擁有該最大的佇列條目個數的物件控制代碼的所有程序。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

註釋

該擴充套件在I/O completion池存在洩漏的情況下很有用。I/O completion pool 洩露在程序呼叫PostQueuedCompletionStatus 分配I/O completion packet,但是又沒有呼叫GetQueuedCompletionStatus 來釋放,或者程序將completion entries排隊到某個埠,但是又沒有任何執行緒會取出這些entries時就會發生。通過執行!poolused 擴充套件並且檢查ICP
pool tag的值來發現洩露。如果有使用ICP tag的池(pool),那麼就可能發生了洩露。

該擴充套件只有在系統維護了型別列表(type lists)時才能工作。如果設定了HandleFlag並且系統中有很多程序,則可能需要執行很長時間。

可以按下CTRL+BREAK (WinDbg中) 或者CTRL+C (KD中)來中止命令。

附加資訊

關於I/O完成埠( I/O completion port)的資訊,檢視Mark Russinovich 和David Solomon編寫的 Microsoft Windows Internals

!idt

!idt 擴充套件顯示指定的中斷分配表(interrupt dispatch table (IDT))中的中斷服務例程(interrupt service routine (ISR))。

語法

!idt IDT 
!idt [-a
!idt –? 

引數

IDT

指定要顯示的IDT。

-a

沒有指定IDT 時,會以簡短的格式顯示目標機上所有處理器的IDT。如果指定了-a ,則顯示所有IDT的ISR。

-?

在偵錯程式命令視窗中顯示該命令的幫助文字。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該擴充套件命令只能對x64或者x86目標機使用。

註釋

下面是該擴充套件命令的示例:

0: kd> !idt

Dumping IDT:

37:806ba78c hal!PicSpuriousService37
3d:806bbc90 hal!HalpApcInterrupt
41:806bbb04 hal!HalpDispatchInterrupt
50:806ba864 hal!HalpApicRebootService
63:8641376c VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 86413730)
73:862aa044 portcls!CInterruptSyncServiceRoutine (KINTERRUPT 862aa008)
82:86594314 atapi!IdePortInterrupt (KINTERRUPT 865942d8)
83:86591bec SCSIPORT!ScsiPortInterrupt (KINTERRUPT 86591bb0)
92:862b53dc serial!SerialCIsrSw (KINTERRUPT 862b53a0)
93:86435844 i8042prt!I8042KeyboardInterruptService (KINTERRUPT 86435808)
a3:863b366c i8042prt!I8042MouseInterruptService (KINTERRUPT 863b3630)
a4:8636bbec USBPORT!USBPORT_InterruptService (KINTERRUPT 8636bbb0)
b1:86585bec ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 86585bb0)
b2:863c0524 serial!SerialCIsrSw (KINTERRUPT 863c04e8)
b4:86391a54 NDIS!ndisMIsr (KINTERRUPT 86391a18)
         USBPORT!USBPORT_InterruptService (KINTERRUPT 863ae890)
c1:806ba9d0 hal!HalpBroadcastCallService
d1:806b9dd4 hal!HalpClockInterrupt
e1:806baf30 hal!HalpIpiHandler
e3:806baca8 hal!HalpLocalApicErrorService
fd:806bb460 hal!HalpProfileInterrupt

附加資訊

關於ISR和IDT的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

關於如何顯示Itanium目標機上的中斷向量表(interrupt vector table),檢視!ivt

!ih

!ih 顯示指定處理器上的中斷歷史紀錄。

語法

!ih Processor 

引數

Processor

指定某個處理器。如果省略Processor ,則使用當前處理器。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該命令只能對Itanium目標機使用。

註釋

該擴充套件在不涉及程式計數器符號(program counter symbols)的情況下顯示中斷歷史紀錄。要使用程式計數器符號來顯示中斷歷史紀錄,使用!ihs擴充套件。在引匯入口選項中新增/configflag=32來啟用中斷歷史紀錄。

下面是該命令輸出的示例:

kd> !ih
Total # of interruptions = 2093185
Vector              IIP                   IPSR          ExtraField 
        VHPT FAULT  e0000000830d3190      1010092a6018  IFA=      6fc00a0200c 
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe00001de2d0 
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe01befff338 
        VHPT FAULT  e0000000830d3190      1010092a6018  IFA=      6fc00a0200c 
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe00001d9188 
        VHPT FAULT  e0000000830d3880      1010092a6018  IFA= 1ffffe01befff250 
        VHPT FAULT  e0000000830d3fb0      1010092a6018  IFA= e0000165f82dc1c0 
        VHPT FAULT  e000000083063390      1010092a6018  IFA= e0000000fffe0018 
     THREAD SWITCH  e000000085896040  e00000008588c040  OSP= e0000165f82dbd40 
        VHPT FAULT  e00000008329b130      1210092a6018  IFA= e0000165f7edaf30 
        VHPT FAULT  e0000165f7eda640      1210092a6018  IFA= e0000165fff968a9 
    PROCESS SWITCH  e0000000818bbe10  e000000085896040  OSP= e0000165f8281de0 
        VHPT FAULT  e00000008307cfc0      1010092a2018  IFA= e00000008189fe50 
EXTERNAL INTERRUPT  e0000000830623b0      1010092a6018  IVR=               d0 
        VHPT FAULT  e00000008314e310      1010092a2018  IFA= e0000165f88203f0 
        VHPT FAULT  e000000083580760      1010092a2018  IFA= e0000000f00ff3fd 
    PROCESS SWITCH  e00000008558c990  e0000000818bbe10  OSP= e00000008189fe20 
        VHPT FAULT  e00000008307cfc0      1010092a2018  IFA= e0000165f02433f0 
        VHPT FAULT          77cfbda0      1013082a6018  IFA=         77cfbda0 
        VHPT FAULT          77cfbdb0      1213082a6018  IFA=      6fbfee0ff98 
   DATA ACCESS BIT          77b8e150      1213082a6018  IFA=         77c16ab8 
        VHPT FAULT          77ed5d60      1013082a6018  IFA=      6fbfffa6048 
   DATA ACCESS BIT          77ed5d60      1213082a6018  IFA=         77c229c0 
   DATA ACCESS BIT          77b8e1b0      1013082a6018  IFA=         77c1c320 
      USER SYSCALL          77cafa40        10082a6018  Num=               42 
        VHPT FAULT  e00000008344dc20      1010092a6018  IFA= e000010600703784 

!ihs

!ihs 擴充套件使用程式計數器符號(program counter symbols)來顯示指定處理器的中斷歷史紀錄。

語法

!ihs Processor 

引數

Processor

指定某個處理器。如果省略Processor ,則使用當前處理器。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kdexts.dll

該命令只能對Itanium目標機使用。

註釋

使用!ih 擴充套件在不引用程式計數器符號的情況下顯示中斷歷史紀錄。在引匯入口選項中新增/configflag=32來啟用中斷歷史紀錄。

下面是該擴充套件命令的輸出示例:

kd> !ihs
Total # of interruptions = 2093185
Vector              IIP                   IPSR          ExtraField            IIP Symbol
        VHPT FAULT  e0000000830d3190      1010092a6018  IFA=      6fc00a0200c nt!MiAgeAndEstimateAvailableInWorkingSet+0x70
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe00001de2d0 nt!MiAgeAndEstimateAvailableInWorkingSet+0x2b0
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe01befff338 nt!MiAgeAndEstimateAvailableInWorkingSet+0x2b0
        VHPT FAULT  e0000000830d3190      1010092a6018  IFA=      6fc00a0200c nt!MiAgeAndEstimateAvailableInWorkingSet+0x70
        VHPT FAULT  e0000000830d33d0      1010092a6018  IFA= 1ffffe00001d9188 nt!MiAgeAndEstimateAvailableInWorkingSet+0x2b0
        VHPT FAULT  e0000000830d3880      1010092a6018  IFA= 1ffffe01befff250 nt!MiAgeAndEstimateAvailableInWorkingSet+0x760
        VHPT FAULT  e0000000830d3fb0      1010092a6018  IFA= e0000165f82dc1c0 nt!MiCheckAndSetSystemTrimCriteria+0x190
        VHPT FAULT  e000000083063390      1010092a6018  IFA= e0000000fffe0018 nt!KeQuerySystemTime+0x30
     THREAD SWITCH  e000000085896040  e00000008588c040  OSP= e0000165f82dbd40 
        VHPT FAULT  e00000008329b130      1210092a6018  IFA= e0000165f7edaf30 nt!IopProcessWorkItem+0x30
        VHPT FAULT  e0000165f7eda640      1210092a6018  IFA= e0000165fff968a9 netbios!RunTimerForLana+0x60
    PROCESS SWITCH  e0000000818bbe10  e000000085896040  OSP= e0000165f8281de0 
        VHPT FAULT  e00000008307cfc0      1010092a2018  IFA= e00000008189fe50 nt!SwapFromIdle+0x1e0
EXTERNAL INTERRUPT  e0000000830623b0      1010092a6018  IVR=               d0 nt!Kil_TopOfIdleLoop
        VHPT FAULT  e00000008314e310      1010092a2018  IFA= e0000165f88203f0 nt!KdReceivePacket+0x10
        VHPT FAULT  e000000083580760      1010092a2018  IFA= e0000000f00ff3fd hal!READ_PORT_UCHAR+0x80
    PROCESS SWITCH  e00000008558c990  e0000000818bbe10  OSP= e00000008189fe20 
        VHPT FAULT  e00000008307cfc0      1010092a2018  IFA= e0000165f02433f0 nt!SwapFromIdle+0x1e0
        VHPT FAULT          77cfbda0      1013082a6018  IFA=         77cfbda0 0x0000000077cfbda0
        VHPT FAULT          77cfbdb0      1213082a6018  IFA=      6fbfee0ff98 0x0000000077cfbdb0
   DATA ACCESS BIT          77b8e150      1213082a6018  IFA=         77c16ab8 0x0000000077b8e150
        VHPT FAULT          77ed5d60      1013082a6018  IFA=      6fbfffa6048 0x0000000077ed5d60
   DATA ACCESS BIT          77ed5d60      1213082a6018  IFA=         77c229c0 0x0000000077ed5d60
   DATA ACCESS BIT          77b8e1b0      1013082a6018  IFA=         77c1c320 0x0000000077b8e1b0
      USER SYSCALL          77cafa40        10082a6018  Num=               42 0x0000000077cafa40
        VHPT FAULT  e00000008344dc20      1010092a6018  IFA= e000010600703784 nt!ExpLookupHandleTableEntry+0x20

!ioresdes

!ioresdes 擴充套件顯示指定地址處的IO_RESOURCE_DESCRIPTOR結構。

語法

!ioresdes Address 

引數

Address

指定IO_RESOURCE_DESCRIPTOR 結構的16進位制地址。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

附加資訊

檢視Plug and Play除錯獲得該擴充套件命令的應用。關於IO_RESOURCE_DESCRIPTOR結構的資訊,檢視 Windows Driver Kit (WDK) 文件。

!ioreslist

!ioreslist 擴充套件顯示一個IO_RESOURCE_REQUIREMENTS_LIST結構。

語法

!ioreslist Address 

引數

Address

指定IO_RESOURCE_REQUIREMENTS_LIST 結構的16進位制地址。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kdexts.dll

註釋

下面是該擴充套件輸出的示例:

kd> !ioreslist 0xe122b768

IoResList at 0xe122b768 : Interface 0x5  Bus 0  Slot 0xe
  Alternative 0 (Version 1.1)
    Preferred Descriptor 0 – Port (0x1) Device Exclusive (0x1)
      Flags (0x01) – PORT_IO
      0x000100 byte range with alignment 0x000100
      1000 – 0x10ff
    Alternative Descriptor 1 – Port (0x1) Device Exclusive (0x1)
      Flags (0x01) – PORT_IO
      0x000100 byte range with alignment 0x000100
      0 – 0xffffffff
    Descriptor 2 – DevicePrivate (0x81) Device Exclusive (0x1)
      Flags (0000) –
      Data:              : 0x1 0x0 0x0
    Preferred Descriptor 3 – Memory (0x3) Device Exclusive (0x1)
      Flags (0000) – READ_WRITE
      0x001000 byte range with alignment 0x001000
      40080000 – 0x40080fff
    Alternative Descriptor 4 – Memory (0x3) Device Exclusive (0x1)
      Flags (0000) – READ_WRITE
      0x001000 byte range with alignment 0x001000
      0 – 0xffffffff
    Descriptor 5 – DevicePrivate (0x81) Device Exclusive (0x1)
      Flags (0000) –
      Data:              : 0x1 0x1 0x0
    Descriptor 6 – Interrupt (0x2) Shared (0x3)
      Flags (0000) – LEVEL_SENSITIVE
      0xb – 0xb

IO_RESOURCE_REQUIREMENTS_LIST包含這些資訊:

  • 資源型別

有四種型別的資源: I/O、記憶體、IRQ、DMA。

  • 描述符(Descriptor)

每個首選設定都有一個"Preferred" 描述符和數個"Alternative"描述符。

資源列表包含下面這些需求:

  • I/O 範圍

申請了0x1000 到0x10FF 的範圍,但是隻要按0x100對齊的話,可以使用從0到0xFFFFFFFF 之間任何0x100 長度的範圍,(例如,可以訪問0x1100 到0x11FF。)

  • 記憶體

申請了0x40080000 到0x40080FFF的範圍,但是可以使用0到0xFFFFFFFF 之間以0x1000對齊的任何大小為0x1000的範圍。

  • IRQ

必須使用 IRQ 0xB。

中斷和DMA通道是以開始和結束相同的區域的形式。

附加資訊

檢視Plug and Play 除錯獲得該擴充套件命令的應用。IO_RESOURCE_REQUIREMENTS_LIST結構的資訊,檢視Windows Driver Kit (WDK)文件。

7月21日

WinDbg 文件翻譯—-78

cc682/NetRoc

http://netroc682.spaces.live.com/

!eb, !ed

!eb 和!ed 擴充套件向指定的實體地址寫入一系列值。

這些命令不能和e* (Enter Values) 命令混淆。

語法

!eb [FlagPhysicalAddress Data [ … ] 
!ed [FlagPhysicalAddress Data [ … ] 

引數

Flag

可以是下面這些值中的一個。Flag 必須包含在中括號中:

[c]

寫入已緩衝記憶體(cached memory)。

[uc]

寫入未緩衝記憶體(uncached memory)。

[wc]

寫入寫聚合記憶體(write-combined memory)。

PhysicalAddress

指定在目標機實體記憶體中要寫入的開始地址,以16進位制。

Data

指定要連續寫入實體記憶體的一個或多個值。以16進位制輸入這些值。對於!eb 擴充套件,每個值都必須是1位元組(兩個16進位制數字)。對於!ed 擴充套件,每個值都必須是一個DWRODe(8個16進位制數字)。一行中可以包含任意數量的 Data 值。使用逗號或者空格分隔多個值。

DLL

Windows NT 4.0

Kext.dll 
Kdextx86.dll

Windows 2000

Kext.dll 
Kdextx86.dll

Windows XP和之後

Kext.dll

 

附加資訊

使用!d* 擴充套件來讀取實體記憶體。記憶體操作的概述和其他記憶體相關命令的描述,檢視 讀寫記憶體

!ecb, !ecd, !ecw

!ecb!ecd!ecw 擴充套件向PCI配置空間(PCI configuration space)進行寫入。

語法

!ec Bus.Device.Function Offset Data 

引數

Bus

指定匯流排。Bus可以從0到0xFF。

Device

指定裝置的插槽裝置號(slot device number)。

Function

指定裝置的插槽功能號(slot function number)。

Offset

指定要寫入的地址。

Data

要寫入的資料。對於!ecb 擴充套件,Data 必須是1位元組(兩個16進位制數字)。對於!ecw 擴充套件,Data 必須是WORD(4個16進位制數字)。 對於!ecd 擴充套件,Data必須是DWORD (8個16進位制數字)。

DLL

Windows NT 4.0

Kext.dll

Windows 2000

Kext.dll

Windows XP和之後

Kext.dll

這些命令只能對x86目標機使用。

註釋

不能用這幾個命令來寫入一系列Data值。要這樣做,只有通過重複使用它們。

使用!pci 100 Bus Device Function來顯示PCI配置空間(PCI configuration space)。

附加資訊

檢視Plug and Play除錯獲得該擴充套件命令的應用,以及更多的例子。關於PCI匯流排的資訊,檢視Windows Driver Kit (WDK)文件。

!ecs

!ecs 擴充套件已經廢棄。要編輯PCI配置空間(PCI configuration space),使用!ecb、 !ecd、或者!ecw

!errlog

!errlog 擴充套件顯示I/O系統的錯誤日誌中任何掛起的條目(pending entry)的內容。

語法

!errlog 

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

註釋

該命令顯示I/O系統錯誤日誌中的任何掛起事件(pending event)的資訊。這些是通過呼叫IoWriteErrorLogEntry 函式排隊的事件,用來寫入系統的事件日誌中提供Event Viewer檢視。

只有被IoWriteErrorLogEntry 排隊但是還沒有提交給錯誤日誌的條目會被顯示出來。

該命令可以在系統崩潰後用作診斷的輔助,因為它會顯示系統崩潰時還沒來得及提交給錯誤日誌的那些掛起的錯誤資訊。

附加資訊

關於 IoWriteErrorLogEntry的更多資訊,檢視Windows Driver Kit (WDK)文件。

!exca

!exca 擴充套件顯示PC-Card Interrupt Controller (PCIC) Exchangable Card Architecture (ExCA) registers。

語法

!exca BasePort.SocketNumber 

引數

BasePort

指定PCIC的基礎埠(base port)。

SocketNumber

指定PCIC的ExCA暫存器的socket number。

DLL

Windows NT 4.0

不可用

Windows 2000

Kext.dll 
Kdextx86.dll

Windows XP和之後

Kext.dll

!exca 擴充套件僅對x86目標機可用。

附加資訊

!cbreg 擴充套件可以用來通過地址顯示CardBus Socket registers 和CardBus ExCA registers。

!exqueue

!exqueue 擴充套件顯示ExWorkerQueue 工作佇列(work queue)中當前被排隊的專案列表。

語法

!exqueue [Flags

引數

Flags

可以是下面這些值的任意組合。預設值為0x0,只顯示很有限的資訊。

Bit 0 (0x1)

如果沒有設定0x02的話,顯示時間和優先順序統計。

Bit 1 (0x2)

顯示工作佇列關聯的執行緒和事件列表,以及它們的等待狀態。

Bit 2 (0x4)

顯示和工作佇列關聯的執行緒列表。如果沒有同時使用0x2,則每個執行緒顯示在單獨的一行上。如果使用了0x2,每個執行緒和一個堆疊回溯一起顯示。

Bit 3 (0x8)

(Windows XP和之後) 在佇列的每個執行緒的顯示中加入返回地址、堆疊指標、以及(在Itanium系統中)bsp暫存器的值。不會顯示函式的引數。

Bit 4 (0x10)

只顯示臨界工作佇列(critical work queue)。

Bit 5 (0x20)

只顯示被延時工作佇列(delayed work queue)。

Bit 6 (0x40)

只顯示超臨界工作佇列(hypercritical work queue)。

 

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

註釋

如果Flags 不包含bit 4、5、6,則顯示中包括臨界工作佇列 (critical work queue)、延時工作佇列(delayed work queue),以及超臨界工作佇列(hypercritical work queue)。

下面是該命令輸出的示例:

kd> !exqueue
Dumping ExWorkerQueue: 8046A5C0

**** Critical WorkQueue( current = 0 maximum = 1 )
THREAD fe502940  Cid 8.c  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5026c0  Cid 8.10  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe502440  Cid 8.14  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5021c0  Cid 8.18  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe501020  Cid 8.1c  Teb: 00000000  Win32Thread: 00000000 WAIT

**** Delayed WorkQueue( current = 0 maximum = 1 )
THREAD fe501da0  Cid 8.20  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe501b20  Cid 8.24  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5018a0  Cid 8.28  Teb: 00000000  Win32Thread: 00000000 WAIT

**** HyperCritical WorkQueue( current = 0 maximum = 1 )
THREAD fe501620  Cid 8.2c  Teb: 00000000  Win32Thread: 00000000 WAIT

!exqueue 輸出中的重要資訊有:

引數

含義

current

佇列中的執行中執行緒的數量;即佇列中非等待狀態的執行緒數量。

maximum

佇列中任何給定時間點允許執行的執行緒數量。這個一般是由系統中處理器數量決定的。

 

系統會執行任何current 值比maximum 值小的佇列中的work item。如果current 大於或等於maximum ,則在有更多的佇列中的執行緒完成執行或者進入等待狀態之前,不會有新的work item被執行。該規則當某個CPU密集型work item正在執行並且不會進入等待狀態時會延遲系統,因為它會阻止新的work item被執行,即使佇列中還有空閒執行緒。

附加資訊

關於工作者執行緒的更多資訊,檢視Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!filecache

!filecache 擴充套件顯示系統檔案快取和PTE使用的資訊。

語法

!filecache 

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

註釋

該擴充套件命令的輸出中,每一行都是一個虛擬地址控制塊(virtual address control block (VACB))。當命名檔案(named file)被對映到VACB中時,還會顯示這些檔案的名字。如果出現"no name for file" ,則表示該VACB是用於快取後設資料(metadata)的。

下面是在Windows 2000系統上的一個示例:

kd> !filecache
***** Dump file cache******
File Cache Information
  Current size 7088 kb
  Peak size    11376 kb
 loading file cache database…
  File cache has 129 valid pages
Usage Summary in KiloBytes (Kb):
Control Valid Standby Dirty Shared Locked PageTables  name
80994c08   248      0     0     0     0     0    No Name for File
80995c88   528      0     0     0     0     0    No Name for File
80992a28   120      0     0     0     0     0    No Name for File
80993d28    32      0     0     0     0     0    No Name for File
8098c1e8     8      0     0     0     0     0    mapped_file( SysEvent.Evt )
8091a908     8      0     0     0     0     0    No Name for File
8091d708    16      0     0     0     0     0    No Name for File
80992f08     8      0     0     0     0     0    No Name for File
8098ca48     8      0     0     0     0     0    No Name for File
80949ea8     8      0     0     0     0     0    No Name for File
80992828    16      0     0     0     0     0    No Name for File
8155c688     8      0     0     0     0     0    mapped_file( cmd.exe )

下面是在Windows XP系統上的一個示例:

kd> !filecache
***** Dump file cache******
  Reading and sorting VACBs …
  Removed 1811 nonactive VACBs, processing 235 active VACBs …
File Cache Information
  Current size 28256 kb
  Peak size    30624 kb
  235 Control Areas
Skipping view @ c1040000 – no VACB, but PTE is valid!
  Loading file cache database (100% of 131072 PTEs)
  SkippedPageTableReads = 44
  File cache has 4056 valid pages
 

  Usage Summary (in Kb):
Control Valid Standby/Dirty Shared Locked Name
817da668     4      0     0     0  $MftMirr
8177ae68   304    920     0     0  $LogFile
81776160   188      0     0     0  $BitMap
817cf370     4      0     0     0  $Mft
81776a00     8      0     0     0  $Directory
817cfdd0     4      0     0     0  $Directory
81776740    36      0     0     0    No Name for File
817cf7c8    20      0     0     0  $Directory
817cfb98   304      0     0     0  $Directory
8177be40    16      0     0     0  $Directory
817dadc0  2128     68     0     0  $Mft
817cf008     4      0     0     0  $Directory
817d0258     8      4     0     0  $Directory
817763f8     4      0     0     0  $Directory

8173f058     4      0     0     0  $Directory
8173e628    32      0     0     0  $Directory
8173e4c8    32      0     0     0  $Directory
8173da38     4      0     0     0  $Directory
817761f8     4      0     0     0  $Directory
81740530    32      0     0     0  $Directory
8173d518     4      0     0     0  $Directory
817d9560     8      0     0     0  $Directory
8173f868     4      0     0     0  $Directory
8173fc00     4      0     0     0  $Directory
81737278     4      0     0     0  $MftMirr
81737c88    44      0     0     0  $LogFile
81735fa0    48      0     0     0  $Mft
81737e88   188      0     0     0  $BitMap
817380b0     4      0     0     0  $Mft
817399e0     4      0     0     0  $Directory
817382b8     4      0     0     0  $Directory
817388d8    12      0     0     0    No Name for File
81735500     8      0     0     0  $Directory
81718e38   232      0     0     0  default
81735d40    48     20     0     0  SECURITY
81723008  8632      0     0     0  software
816da3a0    24     44     0     0  SAM
8173dfa0     4      0     0     0  $Directory

8173ba90     4      0     0     0  $Directory
8170ee30     4     36     4     0  AppEvent.Evt
816223f8     4      0     0     0  $Directory
8170ec28     8     28     4     0  SecEvent.Evt
816220a8     4      0     0     0  $Directory
8170ea20     4     32     4     0  SysEvent.Evt
8170d188   232      0     0     0  NTUSER.DAT
81709f10     8      0     0     0  UsrClass.dat
81708918   232      0     0     0  NTUSER.DAT
81708748     8      0     0     0  UsrClass.dat
816c58f8    12      0     0     0  change.log
815c3880     4      0     0     0  $Directory
81706aa8     4      0     0     0  SchedLgU.Txt
815ba2d8     4      0     0     0  $Directory
815aa5f8     8      0     0     0  $Directory
8166d728    44      0     0     0  Netlogon.log
81701120     8     16     4     0  es.dll
816ff0a8     4      8     4     0  stdole2.tlb
8159a358     4      0     0     0  $Directory
8159da70     4      0     0     0  $Directory
8159c158     4      0     0     0  $Directory
815cb9b0     4      0     0     0  00000001
81779b20     4      0     0     0  $Directory
8159ac20     4      0     0     0  $Directory
815683f8     4      0     0     0  $Directory
81566978   580      0     0     0  NTUSER.DAT
81568460     4      0     0     0  $Directory
815675d8    68      0     0     0  UsrClass.dat
81567640     4      0     0     0  $Directory

81515878     4      0     0     0  $Directory
81516870     8      0     0     0  $Directory
8150df60     4      0     0     0  $Directory

816e5300     4      0     0     0  $Directory
8152afa0    16    212     0     0  msmsgs.exe
8153bbd8     4     32     0     0  stdole32.tlb
8172f950   488    392     0     0  OBJECTS.DATA
8173e9c0     4      0     0     0  $Directory
814f4538     4      0     0     0  $Directory
81650790   344     48     0     0  INDEX.BTR
814f55f8     4      0     0     0  $Directory

814caef8     4      0     0     0  $Directory
8171cd90  1392     36     0     0  system
815f07f0     4      0     0     0  $Directory
814a2298     4      0     0     0  $Directory
81541538     4      0     0     0  $Directory
81585288    28      0     0     0  $Directory
8173f708     4      0     0     0  $Directory

8158cf10     4      0     0     0  $Directory

附加資訊

關於檔案系統驅動的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon編寫的 Microsoft Windows Internals

!filelock

!filelock 擴充套件顯示某個檔案鎖結構(file lock structure)。

語法

Windows NT 4.0 和Windows 2000的語法

!filelock FileLockAddress 

Windows XP和之後系統的語法

!filelock FileLockAddress 
!filelock ObjectAddress 

引數

FileLockAddress

指定檔案鎖結構的16進位制地址。

ObjectAddress

(Windows XP和之後) 指定擁有檔案鎖的檔案物件的16進位制地址。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

附加資訊

關於檔案物件的資訊,檢視Windows Driver Kit (WDK) 文件,以及Mark Russinovich 和David Solomon編寫的 Microsoft Windows Internals 。

!fileobj

!fileobj 擴充套件顯示FILE_OBJECT 結構的詳細資訊。

語法

!fileobj FileObject 

引數

FileObject

指定FILE_OBJECT結構的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kexts.dll

註釋

如果 FILE_OBJECT 結構擁有關聯的快取,!fileobj 會嘗試解析並顯示快取資訊。

附加資訊

關於檔案物件的資訊,檢視Microsoft Windows SDK文件、Windows Driver Kit (WDK)文件、以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

!filetime

!filetime 擴充套件將一個64位FILETIME 結構轉換成可讀的時間形式。

語法

!filetime Time 

引數

Time

指定一個64位FILETIME結構。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

註釋

下面是該擴充套件的輸出的示例:

kd> !filetime 1c4730984712348
 7/26/2004 04:10:18.712 (Pacific Standard Time)

!finddata

!finddata 擴充套件顯示某個指定的檔案物件給定偏移地址處的已快取資料(cached data)。

語法

!finddata FileObject Offset 

引數

FileObject

指定檔案物件的地址。

Offset

指定偏移。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之後

Kexts.dll

附加資訊

關於快取管理的資訊,檢視Microsoft Windows SDK 文件,以及Mark Russinovich 和David Solomon 編寫的Microsoft Windows Internals

關於其他快取管理擴充套件命令的資訊,檢視!cchelp 命令。

!findfilelockowner

!findfilelockowner 擴充套件通過在所有執行緒中檢查某個阻塞在IopSynchronousServiceTail 斷言上,並且使用檔案物件作為引數的執行緒,來查詢該檔案物件的所有者。

語法

!findfilelockowner [FileObject]

引數

FileObject

指定檔案物件的地址。如果省略FileObject,則命令搜尋當前程序中所有在IopAcquireFileObjectLock 等待的執行緒並且從堆疊回溯中獲得檔案物件的地址。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之後

Kexts.dll

註釋

當經歷了某次臨界區(critical section)超時,並且超時的執行緒是在IopAcquireFileObjectLock 中等待檔案時,該擴充套件是最有用的。找到這個出問題的執行緒後,擴充套件命令會嘗試復原該請求的IRP,並且顯示正在處理該IRP的驅動程式。

該擴充套件命令由於要遍歷系統中所有執行緒的呼叫堆疊,直到找到出問題的執行緒,所以可能要花費一些時間。可以通過按下CTRL+BREAK (WinDbg中) 或者 CTRL+C (KD中)來中斷它。

附加資訊

關於檔案物件的資訊,檢視Microsoft Windows SDK 文件、 Windows Driver Kit (WDK) 文件、以及Mark Russinovich 和David Solomon編寫的 Microsoft Windows Internals

!for_each_process

!for_each_process 擴充套件對目標機中的每個程序執行一次指定的偵錯程式命令。

語法

!for_each_process ["CommandString"
!for_each_process -? 

引數

CommandString

指定要為每個程序執行的偵錯程式命令。

如果CommandString包含多條命令,則需要用分號(;)分隔他們,並且將CommandString包含在引號(")中。如果CommandString 被包含在引號中,則CommandString 中的命令不能包含引號。在CommandString中,@#Process 用來替換成程序的地址。

-?

在偵錯程式命令視窗中顯示該擴充套件的幫助。