您的位置:首页 > 其它

ZZ:windbg 常用命令

2013-11-07 11:23 381 查看
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 1

!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。

14:59 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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 Session] 0 Flags ImageName

Windows XP和之后的语法:

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

!process [/s Session] [/m Module] 0 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。

14:58 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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)

显示中包含原始字节格式的信息。如果设置了MinAddress、MaxAddress,或者标志的位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 [- Option] Expression [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。

14:56 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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 ....@...........

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

指定要显示哪个控制块。如果Flag为1,调试器显示所有控制块。如果Flag为0,调试器仅显示引用控制块 (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 扩展。

14:43 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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。

14:43 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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-Context847eeed0-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

13:57 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

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调试扩展以及

ACPI
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)文档。

13:56 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告
(0) | 写入日志

7月21日

WinDbg 文档翻译----78

cc682/NetRoc

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


!eb, !ed

!eb!ed 扩展向指定的物理地址写入一系列值。

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

语法

!eb [Flag] PhysicalAddress Data [ ... ]

!ed [Flag] PhysicalAddress 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 用来替换成进程的地址。

-?

在调试器命令窗口中显示该扩展的帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: