• windbg命令详解


     

    DLL

    该扩展仅在内核模式下使用,即使它是在Ext.dll中的。

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    如果不提供参数,调试器会列出所有进程,以及时间和优先级统计。这和使用!process @#Process 0 作为CommandString值一样。

    To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL+C (in KD).

    附加信息

    关于进程的一般信息,查看线程和进程。进程操作和获取进程信息,查看控制进程和线程

    !for_each_thread

    !for_each_thread 扩展对目标机中每个线程执行一次指定的调试器命令。

    语法

    !for_each_thread ["CommandString"
    !for_each_thread -? 

    参数

    CommandString

    指定要为每个线程执行的调试器命令。如果CommandString 包括多条命令,则需要用分号(;)分隔他们,并且将CommandString包含在引号(")中。如果CommandString 被包含在引号中,则CommandString 中的命令不能包含引号。在CommandString中,@# Thread用来替换成线程的地址。

    -?

    在调试器命令窗口中显示该扩展的帮助。

    DLL

    该扩展仅在内核模式下使用,即使它是在Ext.dll中的。

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    如果未提供参数,调试器列举所有线程,以及它们的等待状态。这相当于使用!thread @#Thread 2 作为CommandString的值。

    可以通过按下CTRL+BREAK (WinDbg中) 或者CTRL+C (KD中)来中止操作。

    附加信息

    关于线程的常规信息,查看线程和进程。线程的操作和信息获取,查看控制进程和线程

    !fpsearch

    !fpsearch 扩展在已释放的特殊池(freed special pool)中搜索指定地址。

    语法

    !fpsearch [Address] [Flag]

    参数

    Address

    指定一个虚拟地址。

    Flag

    如果设置,调试器在搜索freed special pool时显示free list中每个页面的原始内容。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    针对每个地址的显示包括虚拟地址、页面帧编号(page frame number (PFN))、pool tag、大小、该地址的数据是否可分页,以及释放该内存时的线程ID和调用堆栈。

    如果Address是-1,调试器显示整个freed special pool。

    如果调试器在freed special pool中找不到指定地址,则不会显示任何东西。下面是该命令的一个输出示例:

    kd> !fpsearch -1 1
    Searching the free page list (8 entries) for all freed special pool

    1EC4000  04000200 e56b6f54 000001f4 0000059c ....Tok.........
    1EC4000  00000800 00000000 00000000 00000000 ................
    1EC4000  bad0b0b0 82100000 00000000 00000000 ................
    1EC4000  72657355 20203233 0000bac5 00000000 User32  ........
    1EC4000  00028b94 00000000 0000bac9 00000000 ................
    1EC4000  00000000 00000000 ffffffff 7fffffff ................
    1EC4000  8153b1b8 00028aff 00000000 00000000 ..S.............
    1EC4000  0000001b 00000000 00000012 00000514 ................

    26A2000  000a0008 00adecb0 000e000c 00adecba ................
    26A2000  000a0008 00adecc8 000e000c 00adecd2 ................
    26A2000  000e000c 00adece0 000e000c 00adecee ................
    26A2000  00120010 00adecfc 000e000c 00aded0e ................
    26A2000  000e000c 00aded1c 000e000c 00aded2a ............*...
    26A2000  000e000c 00aded38 000e000c 00aded46 ....8.......F...
    26A2000  000a0008 00aded54 000e000c 00aded5e ....T.......^...
    26A2000  00120010 00aded6c 000e000c 00aded7e ....l.......~...

    2161000  000a0008 00adeccc 000e000c 00adecd6 ................
    2161000  000a0008 00adece4 000e000c 00adecee ................
    2161000  000e000c 00adecfc 000e000c 00aded0a ................
    2161000  00120010 00aded18 000e000c 00aded2a ............*...
    2161000  000e000c 00aded38 000e000c 00aded46 ....8.......F...
    2161000  000e000c 00aded54 000e000c 00aded62 ....T.......b...
    2161000  000a0008 00aded70 000e000c 00aded7a ....p.......z...
    2161000  00120010 00aded88 000e000c 00aded9a ................

    ...

    CEC8000  0311ffa4 03120000 0311c000 00000000 ................
    CEC8000  00001e00 00000000 7ff88000 00000000 ................
    CEC8000  00000328 00000704 00000000 00000000 (...............
    CEC8000  7ffdf000 00000000 00000000 00000000 ................
    CEC8000  e18ba8c0 00000000 00000000 00000000 ................
    CEC8000  00000000 00000000 00000000 00000000 ................
    CEC8000  00000000 00000000 00000000 00000000 ................
    CEC8000  00000000 00000000 00000000 00000000 ................

    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................
    CEAD000  00000000 00000000 00000000 00000000 ................

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

    !frag

    !frag 扩展显示目标系统的内存池的碎片信息。

    语法

    !frag [Flags

    参数

    Flags

    指定输出级别。可以是下面这些位的任意组合,默认值为0。

    Bit 0 (0x1)

    对每个索引(index)显示碎片的数量和大小。

    Bit 1 (0x2)

    显示分配信息。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    如果内存池碎片非常多的话,会降低性能。下面是该命令的输出示例:

    kd> !frag 1
      NonPaged Pool Fragmentation
    index:  0 number of fragments:     4  bytes:    128
    index:  1 number of fragments:     0  bytes:      0
    index:  2 number of fragments:     2  bytes:    192
    index:  3 number of fragments:     0  bytes:      0
    ...
    index: 20 number of fragments:     0  bytes:      0
    index: 21 number of fragments:     0  bytes:      0
    index: 22 number of fragments:     1  bytes:   7232
    index: 23 number of fragments:     0  bytes:      0
    index: 24 number of fragments:     0  bytes:      0
     Number of fragments:      11 consuming    9344 bytes
     NonPagedPool Usage:  1105920 bytes

    kd> !frag 2
      NonPaged Pool Fragmentation
    818718a0 size:   20 previous size:   a0  Cc
    81870720 size:   20 previous size:   60  Cc
    80d1ae80 size:   20 previous size:   a0  Cc
    818703c0 size:   20 previous size:   60  Cc
    80962600 size:   60 previous size:   a0  ScsD
    8098c180 size:   60 previous size:  100  ScsD
    81937680 size:  160 previous size:   40  Lric
    81870e00 size:  120 previous size:   20  None
    81937d80 size:  260 previous size:   20  Thre
    81936000 size:  220 previous size:    0  Proc
    81610260 size: 1c40 previous size:  260  à
    Number of fragments:      11 consuming    9344 bytes
    NonPagedPool Usage:  1105920 bytes

    附加信息

    关于内存管理的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !frozen

    !frozen 扩展显示每个处理器的状态。

    语法

    !frozen 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    注释

    下面是该命令的输出示例:

    0: kd> !frozen
    Processor states:
           0 : Current
           1 : Frozen

    !fwver

    !fwver 扩展显示Itanium固件版本。

    语法

    !fwver 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    该扩展命令只能对Itanium目标机使用。

    注释

    下面是该扩展的输出示例:

    kd> !fwver

    Firmware Version

       Sal Revision:        0
       SAL_A_VERSION:       0
       SAL_B_VERSION:       0
       PAL_A_VERSION:       6623
       PAL_B_VERSION:       6625
       smbiosString:        W460GXBS2.86E.0117A.P08.200107261041

    附加信息

    更多信息,查看Intel架构手册。

    7月20日

    WinDbg 文档翻译----77

    cc682/NetRoc

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

    !defwrites

    !defwrites 扩展显示缓存管理器(cache manager)使用到的内核变量的值。

    语法

    !defwrites 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    当延迟写入("脏页面(dirty pages)")太大时,会造成页面写入减速(throttled)。该扩展命令允许查看是否系统到达了这个点。

    下面是一个示例:

    kd> !defwrites 
    *** Cache Write Throttle Analysis ***

            CcTotalDirtyPages:                   0 (       0 Kb)
            CcDirtyPageThreshold:             1538 (    6152 Kb)
            MmAvailablePages:                 2598 (   10392 Kb)
            MmThrottleTop:                     250 (    1000 Kb)
            MmThrottleBottom:                   30 (     120 Kb)
            MmModifiedPageListHead.Total:      699 (    2796 Kb)

    Write throttles not engaged

    这种情况下,没有脏页面。如果CcTotalDirtyPages 到达 1538 (CcDirtyPageThreshold 的值),在脏页面变少之前,写入都会变慢。

    附加信息

    关于写入延迟(write throttling)的信息,查看Mark Russinovich and David Solomon 编写的Microsoft Windows Internals

    关于其他缓存管理器扩展的信息,使用!cchelp扩展。

    !devext

    !devext 扩展显示各种总线上的设备的总线相关设备扩展信息(bus-specific device extension information)。

    语法

    !devext Address TypeCode 

    参数

    Address

    指定要显示的设备扩展的16进制地址。

    TypeCode

    指示拥有要显示的设备扩展的对象类型。类型代码不区分大小写,可能的类型代码如下:

    类型代码

    对象

    PCI

    (仅Windows 2000) PCI设备扩展(device extension)

    ISAPNP

    ISA PnP设备扩展

    PCMCIA

    PCMCIA设备扩展

    HID

    HID 设备扩展

    USBD

    (仅Windows 2000) USB 总线驱动扩展

    UHCD

    (仅Windows 2000) UHCD host controller 扩展

    OpenHCI

    (仅Windows 2000) Open HCI host controller 扩展

    USBHUB

    (仅Windows 2000) USB hub 扩展

    MF

    (仅Windows 2000) MF 设备扩展

     

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    !usbhub !hidfdo、以及 !hidpdo 扩展命令已经废除,它们的功能被整合到!devext中。

    对于!devext不再支持的对象类型,可以使用dt (Display Type) 调试器命令。

    下面是一个ISA PnP设备扩展的示例:

    kd> !devext e0000165fff32190 ISAPNP
    ISA PnP FDO @ 0x00000000, DevExt @ 0xe0000165fff32190, Bus # 196639
    Flags (0x854e2530)  DF_ACTIVATED, DF_QUERY_STOPPED, 
                        DF_STOPPED, DF_RESTARTED_NOMOVE, 
                        DF_BUS
                        Unknown flags 0x054e2000

    NumberCSNs           - -536870912
    ReadDataPort         - 0x0000000d (mapped)
    AddressPort          - 0x00000000 (not mapped)
    CommandPort          - 0x00000000 (not mapped)
    DeviceList           - 0xe000000085007b50
    CardList             - 0x00000000
    PhysicalBusDevice    - 0x00000000
    AttachedDevice       - 0x00000000
    SystemPowerState     - Unspecified
    DevicePowerState     - Unspecified

    下面是一个PCI设备的示例:

    kd> !devext e0000000858c31b0 PCI
    PDO Extension, Bus 0x0, Device 0, Function 0.
      DevObj 0xe0000000858c3060 PCI Parent Bus FDO DevExt 0xe0000000858c4960
      Device State = PciNotStarted
      Vendor ID 8086 (INTEL)  Device ID 123D
      Class Base/Sub 08/00  (Base System Device/Interrupt Controller)
      Programming Interface: 20, Revision: 01, IntPin: 00, Line Raw/Adj 00/00
      Enables ((cmd & 7) = 106): BM   Capabilities Pointer = <none>
      CurrentState:          System Working,  Device D0
      WakeLevel:             System Unspecified,  Device Unspecified
      Requirements: <none>

    附加信息

    查看 Plug and Play调试获得该扩展命令的应用。关于设备扩展的更多信息,查看Windows Driver Kit (WDK)文档。

    !devnode

    !devnode 扩展显示设备树中的某个节点的信息。

    语法

    !devnode Address [Flags] [Service
    !devnode 1 
    !devnode 2 

    参数

    Address

    指定要显示节点的设备扩展的16进制地址。如果为0,则显示主设备树的根(the root of the main device tree)。

    Flags

    指定输出的显示级别。可以是下面这些位的任意组合:

    Bit 0 (0x1)

    显示该设备节点的所有孩子。

    Bit 1 (0x2)

    显示使用的资源 (CM_RESOURCE_LIST)。包含IRP_MN_QUERY_RESOURCES 报告的引导配置(boot configuration ),以及为IRP_MN_START_DEVICE 的AllocatedResources参数中的设备分配的资源。

    Bit 2 (0x4)

    显示中包含IRP_MN_FILTER_RESOURCE_REQUIREMENTS报告的必须的资源(IO_RESOURCE_REQUIREMENTS_LIST)。

    Bit 3 (0x8)

    显示中包含为IRP_MN_START_DEVICE 的AllocatedResourcesTranslated 参数中的设备分配的已转换资源(translated resources)的列表。

    Bit 4 (0x10)

    只显示未启动的设备节点。

    Bit 5 (0x20)

    只显示有问题的设备节点。(包含标志位DNF_HAS_PROBLEM 或DNF_HAS_PRIVATE_PROBLEM的节点)

    Service

    指定服务的名字。如果包含,则只显示该服务所驱动的设备节点。(如果Flags 包含位0x1,则显示该服务驱动的设备节点以及所有子节点。)

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    !devnode 1 命令显示设备对象的pending removals列表。

    !devnode 2 命令列出设备对象的所有pending ejects。

    使用!devnode 0 1查看整个设备树。

    附加信息

    查看Plug and Play调试获得该扩展命令的应用。关于设备树的更多信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals

    !devobj

    !devobj 扩展显示DEVICE_OBJECT 对象的详细信息。

    语法

    !devobj DeviceObject 

    参数

    DeviceObject

    指定设备对象。在Windows NT 4.0中,必须是DEVICE_OBJECT 结构的16进制地址。在Windows 2000和之后的系统中,可以是该结构的16进制地址或者设备名。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    如果DeviceObject 指定设备名,但是没有提供前缀,则假定使用Device前缀。注意命令会在使用表达式求职器之前检查DeviceObject 是否是合法的地址或者设备名。

    显示的信息中包含对象的设备名、设备的当前IRP的信息、以及设备的队列中挂起的IRP的地址列表。还包含该对象上层的设备对象(作为"AttachedDevice"列出)的信息,以及在该设备下层的信息(在"AttachedTo"中列出)。

    可以使用!drvobj !devnode 获得设备对象地址。

    下面是一个示例:

    kd> !devnode
    Dumping IopRootDeviceNode (= 0x80e203b8)
    DevNode 0x80e203b8 for PDO 0x80e204f8
      Parent 0000000000   Sibling 0000000000   Child 0x80e56dc8
      InstancePath is "HTREEROOT"
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
      StateHistory[04] = DeviceNodeEnumerateCompletion (0x30d)
      StateHistory[03] = DeviceNodeStarted (0x308)
      StateHistory[02] = DeviceNodeEnumerateCompletion (0x30d)
      StateHistory[01] = DeviceNodeStarted (0x308)
      StateHistory[00] = DeviceNodeUninitialized (0x301)
      StateHistory[19] = Unknown State (0x0)
      .....
      StateHistory[05] = Unknown State (0x0)
      Flags (0x00000131)  DNF_MADEUP, DNF_ENUMERATED, 
                          DNF_IDS_QUERIED, DNF_NO_RESOURCE_REQUIRED
      DisableableDepends = 11 (from children)

    kd> !devobj 80e204f8
    Device object (80e204f8) is for:
      DriverPnpManager DriverObject 80e20610
    Current Irp 00000000 RefCount 0 Type 00000004 Flags 00001000
    DevExt 80e205b0 DevObjExt 80e205b8 DevNode 80e203b8 
    ExtensionFlags (0000000000)  
    Device queue is not busy.

    附加信息

    查看Plug and Play调试获得该扩展命令的应用。关于设备对象的更多信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals

    !devstack

    !devstack 扩展显示设备对象关联的设备栈的格式化后的信息。

    语法

    !devstack DeviceObject 

    参数

    DeviceObject

    指定设备对象。可以是DEVICE_OBJECT 结构的16进制地址或者设备名。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    如果DeviceObject 指定设备名,但是没有提供前缀,则假定使用Device前缀。注意命令会在使用表达式求职器之前检查DeviceObject 是否是合法的地址或者设备名。

    下面是示例:

    kd> !devstack e000000085007b50
      !DevObj   !DrvObj            !DevExt   ObjectName
      e0000165fff32040  Driverkmixer     e0000165fff32190  
    > e000000085007b50  Driverswenum     e000000085007ca0  KSENUM#00000005
    !DevNode e0000165fff2e010 :
      DeviceInst is "SW{b7eafdc0-a680-11d0-96d8-00aa0051e51d}{9B365890-165F-11D0-A195-0020AFD156E4}"
      ServiceName is "kmixer"

    附加信息

    关于设备栈的更多信息,查看Windows Driver Kit (WDK) 文档。

    !dflink

    !dflink 扩展以前序显示链表。

    语法

    !dflink Address [Count] [Bias

    参数

    Address

    指定LIST_ENTRY 结构的地址。从这个节点开始进行显示。

    Count

    指定要显示的链表成员的最大个数。如果省略,默认值为32。

    Bias

    指定每个指针要忽略的位的掩码。在跟随到下一个位置之前,每个Flink 地址都会进行AND运算(和NOT Bias)。默认值为0(即不忽略任何位)。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    !dflink 扩展通过LIST_ENTRY 结构的Flink 域进行遍历,并显示每个地址的最多4个ULONG。要用其它方向来遍历,使用!dblink

    dl (Display Linked List) 命令比!dblink !dflink更加通用。

    !diskspace

    !diskspace 扩展显示目标机硬盘的可用空间总数。

    语法

    !diskspace Drive: 

    参数

    Drive

    指定磁盘的盘符。Drive之后的冒号 (:) 可选。

    DLL

    Windows NT 4.0

    Kext.dll

    Windows 2000

    Kext.dll

    Windows XP和之后

    Kext.dll

    注释

    示例如下:

    kd> !diskspace c:
    Checking Free Space for c: ..........
       Cluster Size 0 KB
     Total Clusters 4192901 KB
      Free Clusters 1350795 KB
        Total Space 1 GB (2096450 KB)
         Free Space 659.567871 MB (675397 KB)

    kd> !diskspace f:
    Checking Free Space for f: 
    f: is a CDROM drive. This function is not supported!

    !dma

    !dma 扩展显示直接内存访问(Direct Memory Access (DMA))子系统的信息,以及驱动程序验证器的DMA Verifier 选项。

    语法

    !dma 
    !dma Adapter [Flags

    参数

    Adapter

    指定要显示的DMA适配器的16进制地址。如果是0,则显示所有的DMA适配器。

    Flags

    指定显示中包含的信息。可以是下面这些位的任意组合。默认值为0x1。

    Bit 0 (0x1)

    显示一般的适配器信息。

    Bit 1 (0x2)

    显示映射记录(map register)信息。(仅当DMA Verification激活时。)

    Bit 2 (0x4)

    显示公共缓冲区(common buffer)信息。 (仅当DMA Verification激活时。)

    Bit 3 (0x8)

    显示分散/聚合列表(scatter/gather list)信息。 (仅当DMA Verification激活时。)

    Bit 4 (0x10)

    显示硬件设备的设备描述(device description)。 (仅当DMA Verification激活时。)

    Bit 5 (0x20)

    显示等待上下文块(Wait context block)的信息。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    注释

    使用非法参数(例如,!dma 1)会显示简单的帮助文本。

    不带参数使用!dma 扩展时,显示所有DMA适配器和它们的地址的简明列表。这可以用来获得在更长的命令形式中使用的适配器地址。

    下面是一个如何在驱动程序验证器的DMA Verification 选项打开时使用该扩展的示例:

    0:kd> !dma

    Dumping all DMA adapters...

    Adapter: 82faebd0     Owner: SCSIPORT!ScsiPortGetUncachedExtension 
    Adapter: 82f88930     Owner: SCSIPORT!ScsiPortGetUncachedExtension 
    Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
    Master adapter: 80076800

    从输出中,可以看到系统中有三个DMA适配器。SCSIPORT 有两个, NDIS拥有第三个。要查看NDIS适配器的详细信息,可以对它的地址使用!dma

    0:kd> !dma  82f06cd0
    Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters (0x9fe24351)
       MasterAdapter:       00000000
       Adapter base Va      00000000
       Map register base:   00000000
       WCB:                 82f2b604
       Map registers: 00000000 mapped, 00000000 allocated, 00000002 max

       Dma verifier additional information:
       DeviceObject: 82f98690
       Map registers:        00000840 allocated, 00000000 freed
       Scatter-gather lists: 00000000 allocated, 00000000 freed
       Common buffers:       00000004 allocated, 00000000 freed
       Adapter channels:     00000420 allocated, 00000420 freed
       Bytes mapped since last flush: 000000f2

    第一块数据是HAL开发者可以用来调试问题的特定数据。对于自己的情况,"Dma verifier additional information"下面才是感兴趣的数据。在这个例子中,可以看到NDIS分配了0x840个映射记录( map registers)。 这是一个很大的数字,特别是因为NDIS指出了它只需要使用最多2个映射记录。该适配器显然没有用到分散/聚合列表(scatter/gather lists),并且释放了(put away)它所有的adapter channel。查看映射寄存记录更详细的信息:

    0:kd> !dma  82f06cd0 2
    Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
    ...

      Map register file 82f06c58 (0/2 mapped)
         Double buffer mdl: 82f2c188
         Map registers:
            82f06c80: Not mapped
            82f06c8c: Not mapped

      Map register file 82f06228 (1/2 mapped)
         Double buffer mdl: 82f1b678
         Map registers:
            82f06250: 00bc bytes mapped to f83c003c
            82f0625c: Not mapped

      Map register file 82fa5ad8 (1/2 mapped)
         Double buffer mdl: 82f1b048
         Map registers:
            82fa5b00: 0036 bytes mapped to 82d17102
            82fa5b0c: Not mapped
    ...

    例中,可以看到特定的映射记录已经被映射了。每个map register file 是驱动分配的一个映射记录。即,它对应于一次AllocateAdapterChannel 调用。当一些驱动在需要时每次创建一个,并且用完之后又释放掉的情况下,NDIS搜集了大量的这种映射记录文件(map register file)。

    映射记录文件也是以"MapRegisterBase"为名字返回给设备的地址。注意DMA验证器仅hook每个驱动的前64个映射记录(map register)。剩下的由于空间原因被忽略掉(每个映射记录对应三个物理页面)。

    这个例子中,有两个映射记录文件正在被使用。这意味着驱动已经映射了对硬件可见的缓冲区。对第一个来说,有 0xBC个字节映射到了系统虚拟地址 0xF83C003C。

    下面是对公共缓冲区的查看:

    0:kd> !dma  82f06cd0 4
    Adapter: 82f06cd0     Owner: NDIS!NdisMAllocateMapRegisters 
    ...
       Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
          Length:           1000
          Virtual address:  82e77000
          Physical address: 2a77000

       Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
          Length:           12010
          Virtual address:  82e817f8
          Physical address: 2a817f8

       Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
          Length:           4300
          Virtual address:  82e95680
          Physical address: 2a95680

       Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
          Length:           4800
          Virtual address:  82e9d400
          Physical address: 2a9d400

    这里是比较清楚直接,有四个不同长度的公共缓冲区。物理地址和虚拟地址也显示出来了。

    附加信息

    关于驱动程序验证器的更多信息,查看Windows Driver Kit (WDK) 文档。关于DMA的信息,查看Windows Driver Kit (WDK) 文档以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !dpa

    !dpa 扩展显示池(pool)的分配信息。

    语法

    !dpa Options 
    !dpa -? 

    参数

    Options

    必须是下面这些选项中的一个:

    -c

    显示当前的池分配统计。

    -v

    显示当前所有的池分配。

    -vs

    显示中包含堆栈回溯。

    -f

    显示失败的池分配。

    -r

    显示free pool allocations。

    -p Ptr

    显示所有包含指针Ptr的池分配。

    -?

    在调试器命令窗口中显示该扩展的简单帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    注释

    该扩展药工作,必须在Win32k.sys 中启用了pool instrumentation。

    !dpcs

    !dpcs 扩展显示指定的处理器上的延迟过程调用(DPC)队列。

    语法

    !dpcs [Processor

    参数

    Processor

    指定处理器。如果省略Processor ,则显示所有处理器的DPC队列。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    附加信息

    关于DPC的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich and David Solomon 编写的Microsoft Windows Internals

    !driveinfo

    !driveinfo 扩展显示指定驱动器上的卷信息(volume information)。

    语法

    !driveinfo Drive[:
    !driveinfo 

    参数

    Drive

    指定一个驱动器。驱动器名后面的冒号是可选的。

    无参数

    在调试器命令窗口中显示简单的帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kdexts.dll

    注释

    该扩展命令显示的驱动器信息是通过查询基础的文件系统获得的,例如:

    kd> !driveinfo c:
    Drive c:, DriveObject e136cd88
        Directory Object: e1001408  Name: C:
            Target String is 'DeviceHarddiskVolume1'
            Drive Letter Index is 3 (C:)
        Volume DevObj: 82254a68
        Vpb: 822549e0  DeviceObject: 82270718
        FileSystem: FileSystemNtfs
        Volume has 0x229236 (free) / 0x2ee1a7 (total) clusters of size 0x1000
        8850.21 of 12001.7 MB free

    !drivers

    在Windows XP之前的操作系统中,!drivers 扩展命令显示目标机上所有已加载驱动的列表,以及它们的内存使用的摘要信息。

    在Windows XP和之后版本的Windows中,!drivers扩展命令已经废除。使用 lm 命令来显示已加载驱动和其他的模块。命令 lm t n显示的信息和旧的!drivers扩展非常类似。

    语法

    !drivers [Flags

    参数

    Flags

    可以是下面这些值得任意组合。(默认值为0x0。)

    Bit 0 (0x1)

    显示常驻(resident)内存和备用(standby)内存的信息。

    Bit 1 (0x2)

    在Windows NT 4.0中,显示更长更详细的驱动映像列表的信息。包括头信息。如果设置了位2 (0x4),则还包括节信息。

    在Windows 2000中,如果设置了该位而第二位 (0x4)未设置,则显示的信息中包括常驻、备用和已锁定内存,以及 加载器入口地址(loader entry address)。如果设置了位2 ,则功能和Windows NT 4.0中一样。

    Bit 2 (0x4)

    显示驱动映像的更长更详细的信息列表。包括每个节的信息。如果设置了bit 1 (0x2),则还包括头信息。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    不可用

    注释

    该命令显示的说明如下表:

    含义

    Base

    设备驱动代码的16进制起始地址。当造成崩溃的代码的内存地址落在某个驱动的基地址以及列表中下一个驱动的基地址之间时,它一般就是造成错误的驱动。例如,Ncrc810.sys 的基地址是0x80654000。则该地址和0x8065a000之间的任何地址都是属于改驱动的。

    Code Size

    驱动代码的大小,以KB为单位,包括16进制和10进制。

    Data Size

    分配给驱动的数据的总大小,以KB为单位,包括16进制和10进制。

    Locked

    (仅当使用标志0x2 时) 被驱动程序锁定的内存总数。

    Resident

    (仅当使用0x1 或0x2时) 驱动实际驻留在物理内存中的内存大小。

    Standby

    (仅当使用0x1 或0x2时) 备用的驱动内存大小。

    Loader Entry

    (仅当使用标志0x2 时) 加载器入口点(loader entry)的地址。

    Driver Name

    驱动文件名。

    Creation Time

    驱动的链接日期。不要将它和可以被外部工具改变的驱动的文件时间混淆。链接日期是由编译器在驱动或可执行文件编译时设置的。它和文件时间可能比较接近,但不会总是一样的。

     

    下面是一个被删节的该命令的示例:

    kd> !drivers
    Loaded System Driver Summary
    Base     Code Size      Data Size      Driver Name  Creation Time
    80080000 f76c0 (989 kb) 1f100 (124 kb) ntoskrnl.exe Fri May 26 15:13:00
    80400000 d980  ( 54 kb) 4040  ( 16 kb) hal.dll      Tue May 16 16:50:34
    80654000 3f00  ( 15 kb) 1060   ( 4 kb) ncrc810.sys  Fri May 05 20:07:04
    8065a000 a460  ( 41 kb) 1e80   ( 7 kb) SCSIPORT.SYS Fri May 05 20:08:05

    附加信息

    查看Plug and Play 调试获得该扩展命令的应用。关于驱动程序和它们的内存使用的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon编写的 Microsoft Windows Internal

    !drvobj

    !drvobj 扩展命令显示DRIVER_OBJECT 的详细信息。

    语法

    Windows NT 4.0的语法

    !drvobj DriverObject 

    Windows 2000和之后的语法

    !drvobj DriverObject [Flags

    参数

    DriverObject

    指定驱动对象。在Windows NT 4.0中,这必须是 DRIVER_OBJECT 结构的16进制地址。在Windows 2000和之后的系统中,可以是DRIVER_OBJECT的16进制地址或者驱动的名字。

    Flags

    (Windows 2000和之后) 可以是下面这些位的任意组合。(默认为0x01。)

    Bit 0 (0x1)

    显示驱动拥有的设备对象。

    Bit 1 (0x2)

    显示驱动的dispatch例程的入口点。

    Bit 2 (0x4)

    显示驱动的设备对象的详细信息(需要设置bit 0)。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    如果DriverObject 指定设备名,但是没有带前缀,则假定使用Driver 前缀。注意该命令在使用表达式求值器会检查DriverObject是否是合法地址或者设备名。

    如果DriverObject 是一个地址,它必须是DRIVER_OBJECT结构的地址。这可以通过检查传递给DriverEntry 函数的参数得到。

    该扩展命令会显示指定的驱动程序创建的所有设备对象的立标。还会显示该驱动对象注册的所有fast I/O例程。

    下面是一个Symbios Logic 810 SCSI 小端口驱动程序的例子:

    kd> bp DriverEntry          //  breakpoint at DriverEntry

    kd> g
    symc810!DriverEntry+0x40:    
    80006a20: b07e0050 stl     t2,50(sp)

    kd> r a0        //address of DevObj (the first parameter)
    a0=809d5550

    kd> !drvobj 809d5550      //  display the driver object
    Driver object is for:
    Driversymc810
    Device Object list:
    809d50d0

    还可以使用!devobj 809d50d0 来获得设备对象的信息。

    附加信息

    查看Plug and Play 调试获得该扩展命令的应用。关于驱动对象的信息,查看Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internal。

    !dskheap

    !dskheap 扩展显示指定会话的桌面堆信息(desktop heap information)。

    语法

    !dskheap [-v] [-s SessionID]

    参数

    -v

    显示更详细的输出。

    -s SessionID

    指定会话。如果省略该参数,则显示会话0的桌面堆信息。

    DLL

    Windows NT 4.0

    未使用

    Windows 2000

    未使用

    Windows XP和之后

    Kdexts.dll

    注释

    桌面堆信息是由窗口站(window station) 来维护的。

    下面是两个例子:

    kd> !dskheap -s 3
      WinstationDesktop            Heap Size(KB)   Used Rate(%)
    ------------------------------------------------------------
      WinSta0Screen-saver              3072                 0%
      WinSta0Default                   3072                 0%
      WinSta0Disconnect                  64                 4%
      WinSta0Winlogon                   128                 5%
    ------------------------------------------------------
                    Total Desktop: (    6336 KB -   4 desktops)
                    Session ID:  3
    ============================================================
    kd> !dskheap
      WinstationDesktop            Heap Size(KB)   Used Rate(%)
    ------------------------------------------------------------
      WinSta0Default                   3072                 0%
      WinSta0Disconnect                  64                 4%
      WinSta0Winlogon                   128                 9%
      Service-0x0-3e7$Default           512                 4%
      Service-0x0-3e5$Default           512                 0%
      Service-0x0-3e4$Default           512                 1%
      SAWinStaSADesktop                 512                 0%
    ------------------------------------------------------
                    Total Desktop: (    5312 KB -   7 desktops)
                    Session ID:  0
    ============================================================

    附加信息

    关于桌面或桌面堆的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    WinDbg 文档翻译----76

    cc682/NetRoc

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

    !ca

    !ca 扩展命令显示指定的节(section)的控制域(control area)。

    语法

    !ca Address 

    参数

    Address

    指定节的16进制地址。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

     

    注释

    要获得所有已映射的文件的控制域列表,可以使用!memusage 扩展。

    下面是示例:

    kd> !memusage
     loading PFN database
    loading (99% complete)
                 Zeroed:     16 (    64 kb)
                   Free:      0 (     0 kb)
                Standby:   2642 ( 10568 kb)
               Modified:    720 (  2880 kb)
        ModifiedNoWrite:      0 (     0 kb)
           Active/Valid:  13005 ( 52020 kb)
             Transition:      0 (     0 kb)
                Unknown:      0 (     0 kb)
                  TOTAL:  16383 ( 65532 kb)
      Building kernel map
      Finished building kernel map

      Usage Summary (in Kb):
    Control Valid Standby Dirty Shared Locked PageTables  name
    ff8636e8    56    376     0     0     0     0  mapped_file( browseui.dll )
    ff8cf388    24      0     0     0     0     0  mapped_file( AVH32DLL.DLL )
    ff8d62c8    12      0     0     0     0     0  mapped_file( PSAPI.DLL )
    ff8dd468   156     28     0     0     0     0  mapped_file( INOJOBSV.EXE )
    fe424808   136     88     0    52     0     0  mapped_file( oleaut32.dll )
    fe4228a8   152     44     0   116     0     0  mapped_file( MSVCRT.DLL )
    ff8ec848     4      0     0     0     0     0    No Name for File
    ff859de8     0     32     0     0     0     0  mapped_file( timedate.cpl )
    . . . . .

    kd> !ca ff8636e8

    ControlArea @ff8636e8
      Segment:    e1b74548    Flink              0   Blink:               0
      Section Ref        0    Pfn Ref           6c   Mapped Views:        1
      User Ref           1    Subsections        5   Flush Count:         0
      File Object ff86df88    ModWriteCount      0   System Views:        0
      WaitForDel         0    Paged Usage      380   NonPaged Usage       e0
      Flags (10000a0) Image File HadUserReference 

       File: WINNTSystem32rowseui.dll

    Segment @ e1b74548:
       Base address        0  Total Ptes        c8  NonExtendPtes:       c8
       Image commit        1  ControlArea ff8636e8  SizeOfSegment: c8000
       Image Base          0  Committed          0  PTE Template:   31b8438
       Based Addr   76e10000  ProtoPtes   e1b74580  Image Info:    e1b748a4

    Subsection 1. @ ff863720
       ControlArea: ff8636e8  Starting Sector 0 Number Of Sectors 2
       Base Pte     e1b74580  Ptes In subsect        1 Unused Ptes          0
       Flags              15  Sector Offset          0 Protection           1
        ReadOnly CopyOnWrite 

    Subsection 2. @ ff863740
       ControlArea: ff8636e8  Starting Sector 2 Number Of Sectors 3d0
       Base Pte     e1b74584  Ptes In subsect       7a Unused Ptes          0
       Flags              35  Sector Offset          0 Protection           3
        ReadOnly CopyOnWrite 

    Subsection 3. @ ff863760
       ControlArea: ff8636e8  Starting Sector 3D2 Number Of Sectors 7
       Base Pte     e1b7476c  Ptes In subsect        1 Unused Ptes          0
       Flags              55  Sector Offset          0 Protection           5
        ReadOnly CopyOnWrite 

    Subsection 4. @ ff863780
       ControlArea: ff8636e8  Starting Sector 3D9 Number Of Sectors 21f
       Base Pte     e1b74770  Ptes In subsect       44 Unused Ptes          0
       Flags              15  Sector Offset          0 Protection           1
        ReadOnly CopyOnWrite 

    Subsection 5. @ ff8637a0
       ControlArea: ff8636e8  Starting Sector 5F8 Number Of Sectors 3a
       Base Pte     e1b74880  Ptes In subsect        8 Unused Ptes          0
       Flags              15  Sector Offset          0 Protection           1
        ReadOnly CopyOnWrite 

    附加信息

    关于控制域的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !callback

    !callback 扩展显示指定线程的陷阱(trap)相关的回调数据(callback data)。

    语法

    !callback Address [Number

    参数

    Address

    指定线程的16进制地址。如果为-1或者省略,则使用当前线程。

    Number

    指定需要的回调帧(callback frame)的数量。这些帧在显示中会标注出来。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    该命令只能对x86目标机使用。

    注释

    如果系统还没有经历过系统陷阱(system trap),则该扩展命令不会产生有用的数据。

    附加信息

    关于系统陷阱的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !calldata

    !calldata 扩展以命名表(named table)中的函数调用统计(procedure call statistics)的形式显示性能信息。

    语法

    !calldata Table 

    参数

    Table

    用于搜集调用数据的表的名字。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    在老版本的Windows NT 4.0中,使用调用数据(call data)来测量调用性能。

    !can_write_kdump

    !can_write_kdump 扩展用来验证目标机上是否有足够的磁盘空间用来创建指定类型的内核dump文件。

    语法

    !can_write_kdump [-dn] [Options]

    参数

    -dn

    表示目标机上的文件系统是NTFS。如果省略该参数,就不能计算目标机上的磁盘空闲空间总数,会显示一条警告信息。但是,仍然会显示需要的空间数量。

    Options

    可以使用下面这些选项:

    -t

    表示要验证是否有足够空间用来创建minidump。

    -s

    表示要验证是否有足够空间用来创建摘要内核转储(summary kernel dump)。这是默认值。

    -f

    表示要验证是否有足够空间用于创建完整内核转储。

    DLL

    Windows NT 4.0

    Kext.dll

    Windows 2000

    Kext.dll

    Windows XP和之后

    Kext.dll

    注释

    如果未指定Option,则该命令会检查是否有足够空间用于摘要内核转储(summary kernel dump)。

    下面的例子中,没有指定文件系统:

    kd> !can_write_kdump
    Checking kernel summary dump...
    WARNING: Can't predict how many pages will be used, assuming worst-case.
    Physical memory: 285560 KB
    Page file size: 1572864 KB
    NO: Page file too small

    !cbreg

    !cbreg 扩展显示CardBus Socket 寄存器,以及CardBus Exchangable Card Architecture (ExCA) 寄存器。

    语法

    !cbreg [%%]Address 

    参数

    %%

    表示Address 是一个物理地址而不是虚拟地址。

    Address

    指定要显示的寄存器地址。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kext.dll 
    Kdextx86.dll

    Windows XP和之后

    Kext.dll

    !cbreg 扩展仅对x86目标机可用。

    附加信息

    !exca扩展命令可以用来以套接字号(socket number)显示PCIC ExCA寄存器。

    !cchelp

    !cchelp 扩展用于在调试器命令窗口中显示一些缓存管理扩展命令的简要帮助文本。

    语法

    !cchelp 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    附加信息

    关于缓存管理(cache management)的信息,可以查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon编著的Microsoft Windows Internals

    !cchelp 扩展命令会显示!bcb !defwrites !finddata!scm 命令的帮助。其他的缓存管理扩展还包括!openmaps !pcm

    !chklowmem

    !chklowmem 扩展检查使用/pae /nolowmem选项引导的计算机上,4GB以下的物理内存页是否使用了指定的填充模板来填充。

    语法

    !chklowmem 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    该扩展命令在用于验证内核模式驱动是否在4GB分界线以上的物理内存上进行正确操作时有用。一般来说驱动程序将物理地址截断为32位,然后向4GB边界以下写入的时候会出现错误。!chklowmem 扩展命令可以检查对4GB边界以下的任何写入。

    !cmreslist

    !cmreslist 扩展显示指定的设备对象(device object)的CM_RESOURCE_LIST 结构。

    语法

    !cmreslist Address 

    参数

    Address

    指定CM_RESOURCE_LIST 结构的16进制地址。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    附加信息

    查看Plug and Play 调试获得该扩展命令的应用。关于CM_RESOURCE_LIST 结构的更多信息,查看Windows Driver Kit (WDK)文档。

    !cpuinfo

    !cpuinfo 扩展显示目标机的CPU的详细信息。

    语法

    Windows 2000中的语法

    !cpuinfo 

    Windows XP和之后的语法

    !cpuinfo Processor 
    !cpuinfo 

    参数

    Processor

    (Windows XP和之后) 指定要显示的处理器。如果省了,则显示所有处理器。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kdexts.dll

    注释

    !cpuinfo 扩展命令可以在本地内核调试时使用。在Windows 2000目标机上使用时,会显示所有处理器的信息。

    下面是示例:

    kd> !cpuinfo
    CP F/M/S Manufacturer  MHz Update Signature Features 
     0 6,1,9 GenuineIntel  198 000000d200000000 000000ff 

    第一个数字是处理器号。

    附加信息

    关于调试多处理器计算机的更多信息,查看多处理器语法

    !db, !dc, !dd, !dp, !dq, !du, !dw

    !db !dc !dd !dp!dq !du !dw 扩展命令显示目标机上的指定物理地址的数据。

    这些扩展命令不能和d* (Display Memory)命令或者!ntsdexts.dp 扩展命令混淆。

    语法

    !db [Caching] [-m] [PhysicalAddress] [L Size
    !dc [Caching] [-m] [PhysicalAddress] [L Size
    !dd [Caching] [-m] [PhysicalAddress] [L Size
    !dp [Caching] [-m] [PhysicalAddress] [L Size
    !dq [Caching] [-m] [PhysicalAddress] [L Size
    !du [Caching] [-m] [PhysicalAddress] [L Size
    !dw [Caching] [-m] [PhysicalAddress] [L Size

    参数

    Caching

    可以是下面这些值中任意一个。Caching 值必须包含在中括号中:

    [c]

    使得该扩展从已缓存内存(cached memory)中读取。

    [uc]

    使得该扩展从未缓存内存(uncached memory)中读取。

    [wc]

    使得该扩展从写聚合内存(write-combined memory)中读取。

    -m

    每次读取一个内存单元。例如,!db -m 以8位为单位读取内存块,!dw –m以16位为单位读取。如果硬件不支持对32位物理内存的读取,则可能需要使用-m选项。该选项不会影响输出的长度或者形式 — 只会影响对内存的访问方式。

    PhysicalAddress

    以16进制格式指定要显示的物理地址。如果在第一次使用该命令时省略,则默认地址为0。如果在后续的命令中省略,则从上一次显示的末尾开始。

    L Size

    指定要显示的内存块个数。每个块的大小由使用的具体命令决定。

    DLL

    Windows NT 4.0

    Kext.dll 
    Kdextx86.dll

    Windows 2000

    Kext.dll 
    Kdextx86.dll

    Windows XP和之后

    Kext.dll

    注释

    这些命令都用于显示物理内存,但是它们的显示格式和默认的长度不同:

    • !db 扩展显示16进制字节值以及它们对应的ASCII字符。默认的长度为128字节。
    • !dc 显示DWORD值和对应的ASCII字符。默认长度为32个DWORD (共128字节)。
    • !dd 显示DWORD值。默认为32个DWORDs (共128字节)。
    • !dp 显示ULONG_PTR 值。根据指令大小,可能是32位或者64位字。默认长度是一共128个字节。
    • !dq 扩展显示ULONG64_PTR值。它们是32位字。默认长度为一共128字节。
    • !du 扩展显示UNICODE字符。默认长度为16个字符(共32字节),或者直到遇到NULL字符。
    • !dw扩展显示WORD值。默认长度为64个WORD (共128字节)。

    因此,对这些扩展命令中的两个使用一样的Size常常显示出来的结果的长度是不同的。例如,使用!db L 32 会显示32字节(显示16进制字节值),而!dd L 32 会显示128个字节(显示DWORD值)。

    下面是使用了缓存属性标志(caching attribute flag)的示例:

    kd> !dc e9000
    physical memory read at e9000 failed
    If you know the caching attributes used for the memory,
    try specifying [c], [uc] or [wc], as in !dd [c] <params>.
    WARNING: Incorrect use of these flags will cause unpredictable
    processor corruption. This may immediately (or at any time in
    the future until reboot) result in a system hang, incorrect data
    being displayed or other strange crashes and corruption.

    kd> !dc [c] e9000
    #   e9000 000ea002 000ea002 000ea002 000ea002 ................
    #   e9010 000ea002 000ea002 000ea002 000ea002 ................

    附加信息

    使用!e* 扩展命令来写入物理内存。关于内存操作的概述和内存相关命令的描述,查看读写内存

    !dbgprint

    !dbgprint 扩展显示之前发送给DbgPrint 缓冲区的字符串。

    语法

    !dbgprint 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    DbgPrintKdPrint DbgPrintEx、以及KdPrintEx 内核例程会向目标机的缓冲区发送一个格式化后的字符串。如果没有禁用的话,则该字符串会自动在主控机的调试器命令窗口中显示出来。

    一般来说,发送给该缓冲区的信息都会自动在调试器命令窗口中显示出来。但是,这种显示可以通过全局标志实用程序 (gflags.exe)禁用。另外,这种显示不会在本地内核调试时显示。更多信息,查看DbgPrint缓冲区

    !dbgprint 扩展使得缓冲区中的内容被显示出来(不管自动显示是否被禁用)。它不会显示被以组件和重要性级别过滤掉了的信息。 (关于这种过滤的详细信息,查看 读取和过滤调试信息。)

    附加信息

    关于DbgPrint KdPrintDbgPrintEx、以及KdPrintEx的更多信息,查看向调试器发送输出

    !dblink

    !dblink 扩展以反序显示一个链表。

    语法

    Windows NT 4.0的语法

    !dblink Address [Count

    Windows XP和之后的语法

    !dblink Address [Count] [Bias

    参数

    Address

    指定LIST_ENTRY 结构的地址。将会从这个节点开始显示。

    Count

    指定要显示的链表项的最大个数。如果省略,则Windows NT 4.0中默认为24,Windows 2000和之后的系统中为32。

    Bias

    (Windows 2000和之后) 指定每个指针中要忽略的位的掩码。每个Blink 地址在跟随到下一个位置之前会进行AND运算(和Bias的NOT)。默认值为0(即不忽略任何位)。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Kexts.dll

    注释

    !dblink 扩展通过LIST_ENTRY 结构的Blink 字段来进行遍历,并且对每个地址显示最多4个ULONG。可以使用!dflink进行其它方向的遍历。

    dl (Display Linked List)命令比!dblink !dflink更加通用。

    !dcr

    !dcr 扩展显示指定地址处的默认控制寄存器(default control register (DCR))。

    语法

    !dcr Expression [DisplayLevel]

    参数

    Expression

    指定要显示的DCR的16进制地址。@dcr 可以用作该参数。这种情况下,会显示当前处理器的DCR信息。

    DisplayLevel

    可以是下面这些选项中的一个:

    0

    只显示每个DCR字段的值。这是默认值。

    1

    对每个非保留和非忽略的DCR字段显示更深入的信息。

    2

    对所有DCR字段显示深入信息,包括被忽略或保留的那些。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kexts.dll

    该扩展命令只能对Itanium目标机使用。

    注释

    DCR 指定了中断时的处理器状态寄存器值的默认参数。DCR也指定了一些附加的全局控制信息,例如speculative load faults 是否被延迟。

    下面是两个示例:

    kd> !dcr @dcr
    dcr:pp be lc dm dp dk dx dr da dd
    1 0 1 1 1 1 1 1 1 1

    kd> !dcr @dcr 2

      pp : 1 : Privileged Performance Monitor Default
      be : 0 : Big-Endian Default
      lc : 1 : IA-32 Lock check Enable
      rv : 0 : reserved1
      dm : 1 : Defer TLB Miss faults only
      dp : 1 : Defer Page Not Present faults only
      dk : 1 : Defer Key Miss faults only
      dx : 1 : Defer Key Permission faults only
      dr : 1 : Defer Access Rights faults only
      da : 1 : Defer Access Bit faults only
      dd : 0 : Defer Debug faults only
      rv : 0 : reserved2

    !dcs

    !dcs 扩展已经废除。要显示PCI配置空间(configuration space),使用!pci 100 Bus Device Function

    !deadlock

    !deadlock 扩展显示通过驱动程序验证器(Driver Verifier)的Deadlock Detection 选项搜集的死锁(deadlock)信息。

    语法

    !deadlock 
    !deadlock 1 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Kexts.dll

    注释

    该扩展命令只有在驱动程序验证器的Deadlock Detection 选项检测到加锁层次违例(lock hierarchy violation)并产生bug check 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION)时,才能提供有用的信息。

    不带任何参数时,!deadlock 扩展显示基本的加锁的拓扑层次。如果问题不是一帮的循环死锁,该命令会描述遇到了什么情况。

    !deadlock 1 扩展显示堆栈回溯。该堆栈是锁被请求时活动的调用堆栈。

    下面是一个示例:

    0:kd> !deadlock

    Deadlock detected (2 resources in 2 threads):

    Thread 0: A B
    Thread 1: B A

    Where:
    Thread 0 = 8d3ba030
    Thread 1 = 8d15c030
    Lock A =   bba2af30 Type 'Spinlock'
    Lock B =   dummy!GlobalLock Type 'Spinlock'

    显示出了相关的锁和线程。但是,这只是一个摘要信息,可能还不足以调试遇到的问题。

    使用!deadlock 1 来打印出死锁相关的每个锁被请求时的堆栈回溯。由于这是运行时堆栈回溯,所以在使用调试版时会更加完整。在free版上,它们可能在一行之后就被截断了。

    0:kd> !deadlock 1

    Deadlock detected (2 resources in 2 threads):

    Thread 0 (8D14F750) took locks in the following order:

        Lock A -- b7906f30 (Spinlock)
        Stack:   dummy!DummyActivateVcComplete+0x63
                 dummy!dummyOpenVcChannels+0x2E1
                 dummy!DummyAllocateRecvBufferComplete+0x436
                 dummy!DummyAllocateComplete+0x55
                 NDIS!ndisMQueuedAllocateSharedHandler+0xC9
                 NDIS!ndisWorkerThread+0xEE

        Lock B -- dummy!GlobalLock (Spinlock)
        Stack:   dummy!dummyQueueRecvBuffers+0x2D
                 dummy!DummyActivateVcComplete+0x90
                 dummy!dummyOpenVcChannels+0x2E1
                 dummy!DummyAllocateRecvBufferComplete+0x436
                 dummy!DummyAllocateComplete+0x55

    Thread 1 (8D903030) took locks in the following order:

        Lock B -- dummy!GlobalLock (Spinlock)
        Stack:   dummy!dummyRxInterruptOnCompletion+0x25D
                 dummy!DummyHandleInterrupt+0x32F
                 NDIS!ndisMDpcX+0x3C
                 ntkrnlpa!KiRetireDpcList+0x5D

        Lock A -- b7906f30 (Spinlock)
        Stack:   << Current stack >>

    除了当前堆栈之外,这些基本上就是所有需要的信息了。

    0: kd> k
    ChildEBP RetAddr
    f78aae6c 80664c58 ntkrnlpa!DbgBreakPoint
    f78aae74 8066523f ntkrnlpa!ViDeadlockReportIssue+0x2f
    f78aae9c 806665df ntkrnlpa!ViDeadlockAnalyze+0x253
    f78aaee8 8065d944 ntkrnlpa!VfDeadlockAcquireResource+0x20b
    f78aaf08 bfd6df46 ntkrnlpa!VerifierKeAcquireSpinLockAtDpcLevel+0x44
    f78aafa4 b1bf2d2d dummy!dummyRxInterruptOnCompletion+0x2b5
    f78aafc4 bfde9d8c dummy!DummyHandleInterrupt+0x32f
    f78aafd8 804b393b NDIS!ndisMDpcX+0x3c
    f78aaff4 804b922b ntkrnlpa!KiRetireDpcList+0x5d

    从上面这些可以知道有哪些相关的锁,以及它们在什么地方被请求的。这对于调试死锁来说已经包含了足够信息。如果可以使用源码,则还可以使用调试器来查看问题具体出现在什么地方:

    0: kd> .lines
    Line number information will be loaded

    0: kd> u dummy!DummyActivateVcComplete+0x63 l1
    dummy!DummyActivateVcComplete+63 [d: tdriversdummyvc.c @ 2711]:
    b1bfe6c9 837d0c00         cmp     dword ptr [ebp+0xc],0x0

    0: kd> u dummy!dummyQueueRecvBuffers+0x2D l1
    dummy!dummyQueueRecvBuffers+2d [d: tdriversdummy eceive.c @ 2894]:
    b1bf4e39 807d0c01         cmp     byte ptr [ebp+0xc],0x1

    0: kd> u dummy!dummyRxInterruptOnCompletion+0x25D l1
    dummy!dummyRxInterruptOnCompletion+25d [d: tdriversdummy eceive.c @ 1424]:
    b1bf5d05 85f6             test    esi,esi

    0: kd> u dummy!dummyRxInterruptOnCompletion+0x2b5 l1
    dummy!dummyRxInterruptOnCompletion+2b5 [d: tdriversdummy eceive.c @ 1441]:
    b1bf5d5d 8b4648           mov     eax,[esi+0x48]

    现在就知道了源文件的名字,以及请求锁的位置的行号。这种情况下,源文件表明了这些线程的行为如下:

    • 线程1: DummyActivateVcComplete 获得了 dummy 小端口锁(miniport lock)。然后调用dummyQueueRecvBuffers,它会请求dummyglobal lock。
    • 线程2: dummyRxInterruptOnCompletion 获得了global lock。然后,几行之后又请求小端口锁。

    通过这点,死锁原因就清楚了。

    附加信息

    关于驱动程序验证器的信息,查看Windows Driver Kit (WDK) 文档。

    7月17日

    WinDbg 文档翻译----75

    cc682/NetRoc

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

    内核模式扩展

    本参考节主要描述主要在内核模式调试时使用的扩展命令。

    调试器会自动加载这些扩展命令的适当版本。如果没有自己加载不同的版本,则不需要了解究竟使用的是哪个DLL版本。查看使用调试器扩展命令获得默认的模块搜索顺序的说明。查看 加载调试器扩展DLL获得如何加载扩展模块的说明。

    每条扩展命令的参考中都列出了引出该命令的DLL。使用下面的规则来确定扩展DLL是从哪个目录加载的:

    • 如果目标机运行在x86处理器的Windows NT 4.0 发行版上,则使用的是nt4freKdextx86.dll
    • 如果目标机运行在x86处理器平台的Windows NT 4.0 调试版上,使用的是nt4chkKdextx86.dll
    • 如果目标机运行在Windows 2000的发行版上,则使用w2kfreKdextx86.dll
    • 如果目标机运行于Windows 2000调试版,则使用w2kchkKdextx86.dll
    • 如果目标机运行于Windows XP和之后的版本上,则使用winxpKdexts.dll

    另外,winextkext.dll 中的内核模式扩展命令是不针对于特定操作系统的。

    !ahcache

    !ahcache 扩展显示应用程序兼容性缓存(application compatibility cache)。

    语法

    !ahcache [Flags

    参数

    Flags

    指定输出中要包含的信息。可以是下面这些位的任意组合(默认值为0):

    Bit 0 (0x1)

    显示RTL_GENERIC_TABLE 列表,而不是LRU列表。

    Bit 4 (0x10)

    详细输出:包含所有条目的详细信息,而不仅仅是名字。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

     

    !alignmentfaults

    !alignmentfaults 扩展显示位置(location)和映像(image)的所有当前类型对齐错误(type alignment faults),以发生频率排序。

    语法

    !alignmentfaults

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    注释

    仅在调试版系统中可用。

    附加信息

    关于对齐错误的更多信息,查看Microsoft Windows SDK文档。

    !analyzebugcheck

    !analyzebugcheck 扩展命令已经废除,使用!analyze来替代。

    !apc

    !apc 扩展格式化并显示一个或多个异步过程调用(APC)的内容。

    语法

    !apc 
    !apc proc Process 
    !apc thre Thread 
    !apc KAPC 

    参数

    Process

    指定要显示的APC所在进程的地址。

    Thread

    指定要显示的APC所在线程的地址。

    KAPC

    指定要显示的内核APC的地址。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    注释

    不带参数时,!apc显示所有APC。

    下面是一个示例:

    kd> !apc
    *** Enumerating APCs in all processes
    Process e0000000858ba8b0 System
    Process e0000165fff86040 smss.exe
    Process e0000165fff8c040 csrss.exe
    Process e0000165fff4e1d0 winlogon.exe
    Process e0000165fff101d0 services.exe
    Process e0000165fffa81d0 lsass.exe
    Process e0000165fff201d0 svchost.exe
    Process e0000165fff8e040 svchost.exe
    Process e0000165fff3e040 svchost.exe
    Process e0000165fff6e040 svchost.exe
    Process e0000165fff24040 spoolsv.exe
    Process e000000085666640 wmiprvse.exe
    Process e00000008501e520 wmiprvse.exe
    Process e0000000856db480 explorer.exe
    Process e0000165fff206a0 ctfmon.exe
    Process e0000000850009d0 ctfmon.exe
    Process e0000165fff51600 conime.exe
    Process e000000085496340 taskmgr.exe
    Process e000000085489c30 userinit.exe

    附加信息

    关于APC的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !apicerr

    !apicerr 扩展显示本地的高级可编程中断控制器(Advanced Programmable Interrupt Controller (APIC))错误日志。

    语法

    !apicerr [Format

    参数

    Format

    指定显示错误日志内容的顺序。可以是下面这些值的任意一个:

    0x0

    按照发生次序显示。

    0x1

    按照不同处理器显示错误日志。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    该扩展命令只能针对基于x86或x64的目标机使用。

    附加信息

    关于APIC的信息,查看Mark Russinovich 和David Solomon 所著的Microsoft Windows Internals

    !arbinst

    !arbinst 扩展显示指定的arbiter的信息。

    语法

    !arbinst Address [Flags]

    参数

    Address

    指定要显示的arbiter的16进制地址。

    Flags

    指定对每个arbiter要显示多少信息。目前唯一的标志是0x100。如果设置了它,则会显示别名(alias)。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    注释

    对于指定的arbiter,!arbinst 会显示系统资源每个已分配的范围,一些可选标志、附加到该范围的PDO(即该范围的所有者)、以及该所有者得服务名(如果已知的话)。

    下面是一个示例:

    kd> !arbinst e0000106002ee8e8
    Port Arbiter "PCI I/O Port (b=02)" at e0000106002ee8e8
      Allocated ranges:
        0000000000000000 - 0000000000001fff       00000000 <Not on bus>
        0000000000002000 - 00000000000020ff     P e0000000858bea20  (ql1280)
        0000000000003000 - ffffffffffffffff       00000000 <Not on bus>
      Possible allocation:
        < none >
    kd> !arbinst e0000106002ec458
    Memory Arbiter "PCI Memory (b=02)" at e0000106002ec458
      Allocated ranges:
        0000000000000000 - 00000000ebffffff       00000000 <Not on bus>
        00000000effdef00 - 00000000effdefff   B   e0000000858be560 
        00000000effdf000 - 00000000effdffff       e0000000858bea20  (ql1280)
        00000000f0000000 - ffffffffffffffff       00000000 <Not on bus>
      Possible allocation:
        < none >

    附加信息

    参见!arbiter扩展。

    !arbiter

    !arbiter 扩展显示当前的system resource arbiter和arbitrated range。

    语法

    !arbiter [Flags

    参数

    Flags

    指定要显示哪种类型的arbiter。如果省略,则显示所有arbiter。这些位可以自由组合。

    Bit 0 (0x1)

    I/O arbiters.

    Bit 1 (0x2)

    Memory arbiters.

    Bit 2 (0x4)

    IRQ arbiters.

    Bit 3 (0x8)

    DMA arbiters.

    Bit 4 (0x10)

    Bus number arbiters.

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP 和之后

    Kdexts.dll

    注释

    对每个arbiter,!arbiter会显示系统资源每个已分配的范围,一些可选标志、附加到该范围的PDO(即该范围的所有者)、以及该所有者得服务名(如果已知的话)。

    标志的意义如下:

    标志

    意义

    S

    区域被共享

    C

    区域有冲突(conflict)

    B

    区域是boot-allocated的

    D

    区域是driver-exclusive的

    A

    区域别名(alias)

    P

    Range positive decode

     

    下面是一个例子:

    kd> !arbiter 4

    DEVNODE 80e203b8 (HTREEROOT)
      Interrupt Arbiter "" at 80167140
        Allocated ranges:
          0000000000000000 - 0000000000000000   B   80e1d3d8 
          0000000000000001 - 0000000000000001   B   80e1d3d8 
          .....
          00000000000001a2 - 00000000000001a2    
            00000000000001a2 - 00000000000001a2  CB   80e1d3d8 
            00000000000001a2 - 00000000000001a2  CB   80e52538  (Serial)
          00000000000001a3 - 00000000000001a3       80e52778  (i8042prt)
          00000000000001b3 - 00000000000001b3       80e1b618  (i8042prt)
        Possible allocation:
          < none >

    这个例子中, 倒数第二行显示了资源范围(只由0x1A3组成)、0x80E52778的PDO、服务为i8042prt.sys 。这一行没有列出标志。

    现在可以对PDO地址使用 !devobj 来找到设备扩展(device extension)和设备节点(device node)的地址:

    kd> !devobj 80e52778
    Device object (80e52778) is for:
     00000034 DriverPnpManager DriverObject 80e20610
    Current Irp 00000000 RefCount 1 Type 00000004 Flags 00001040
    DevExt 80e52830 DevObjExt 80e52838 DevNode 80e52628 
    ExtensionFlags (0000000000)  
    AttachedDevice (Upper) 80d78b28 Driveri8042prt
    Device queue is not busy.

    附加信息

    查看Plug and Play 调试获得该扩展命令的应用。

    !ate

    !ate 扩展显示指定地址处的预备页表(alternate page table entry (ATE))。

    语法

    !ate Address 

    参数

    Address

    指定要显示的ATE。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    注释

    该扩展仅在Itanium计算机上可用。

    ATE 的状态标志在下表中列出。!ate 的显示以大写字母或者虚线来表示这些位,并且还添加其他附加的信息。

    位设置时的显示

    位清除时的显示

    含义

    V

    -

    提交

    G

    -

    未访问过

    E

    -

    执行

    W

    R

    可写或者只读

    L

    -

    已锁定。该ATE已被锁定,因此在包含该ATE的页面上的任何错误都会重试直到错误被修正。这在多处理器系统上可能发生。

    Z

    -

    填充为0。

    N

    -

    没有访问(No access)。

    C

    -

    写时复制(Copy on Write)

    I

    -

    间接PTE(PTE indirect),该ATE间接引用另外的物理页面。包含该ATE的页面可能有两个不一样的ATE属性(ATE attributes)。

    P

    -

    保留。

     

    附加信息

    关于页表和页目录的信息,查看Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals

    !bcb

    !bcb 扩展显示指定的缓冲区控制块(buffer control block)。

    语法

    !bcb Address 

    参数

    Address

    指定缓冲区控制块的地址。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    Kdextx86.dll

    Windows XP 和之后

    不可用(查看注释节)

    注释

    该扩展仅在Windows 2000上可用。在Windows XP或之后的系统中,使用dt nt!_BCB Address 命令来直接显示缓冲区控制块。

    附加信息

    关于缓存管理的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals

    关于缓存管理得其他扩展命令的信息,使用!cchelp命令。

    !blockeddrv

    !blockeddrv 扩展显示目标机上的blocked drivers列表。

    语法

    !blockeddrv

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    注释

    下面是一个示例:

    kd> !blockeddrv
    Driver:      Status    GUID
    afd.sys      0:        {00000008-0206-0001-0000-000030C964E1}
    agp440.sys   0:        {0000005C-175A-E12D-5000-010020885580}
    atapi.sys    0:        {0000005C-B04A-E12E-5600-000020885580}
    audstub.sys  0:        {0000005C-B04A-E12E-5600-000020885580}
    Beep.SYS     0:        {0000005C-B04A-E12E-5600-000020885580}
    Cdfs.SYS     0:        {00000008-0206-0001-0000-000008F036E1}
    .....

    !bpid

    !bpid 扩展要求目标机上的某个进程中断到调试器中,或者要求用户模式调试器附加到目标机上的某个进程上。

    语法

    !bpid [OptionsPID 

    参数

    Option

    控制该命令的其他行为。

    Option 的合法值有下面这些。

    -a

    将一个新的用户模式调试器附加到PID指定的进程上。该用户模式调试器在目标机上运行。

    -s

    在WinLogon进程中添加一个在PID指定的用户模式进程中断前立即触发的断点。这使得在尝试操作之前有一次机会来验证该请求。

    -w

    将请求保存在目标机的内存中。之后目标系统可以重复该请求,但是一般不需要这样。

     

    PID

    指定目标机上的进程ID。如果使用该命令来控制目标机上的用户模式调试器,则PID应该是目标进程的ID,而不是用户模式调试器的ID。(由于进程ID一般以10进制列出来,所以可能需要在前面加上0n前缀来转换成16进制格式。)

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    该扩展命令仅在x86、x64和Itanium目标机上支持。

    注释

    该命令在将用户模式调试器的输入输出重定向到内核调试器时特别有用。它使得用户模式目标程序中断到用户模式调试器中,并且从内核调试器请求输入。查看从内核调试器控制用户模式调试器获得详细信息。

    如果在其他情况下使用该命令,用户模式进程会调用DbgBreakPoint。这一般会直接中断到内核调试器中。

    -s 选项使得指定进程的断点触发之前先在WinLogon中触发一个断点。如果想在WinLogon的进程上下文中进行一些调试操作时有用。g (Go)命令可以转移到第二个断点。

    有些情况该扩展会失败:

    • 缺乏资源。!bpid 扩展会在目标进程中注入一个线程,所以系统必须有足够资源来创建它。使用-a 选项需要更多的系统资源,因为!bpid -a 必须在目标机上运行一个完整的调试器实例。
    • 加载器锁(loader lock)已经被持有了。!bpid !bpid -a 都需要在目标进程运行一个线程才能让它中断到调试器中。如果另一个线程已经持有了加载器锁,!bpid 线程就不能运行,并且不会造成中断到调试器中。因此,如果 !bpid 在目标进程拥有足够的用户模式内存时失败,则可能是加载器锁已经被持有了。
    • 缺少权限。!bpid 扩展命令的操作需要有足够的权限使得WinLogon创建远线程,以及附加一个调试器到指定进程上。
    • 访问不到ntsd.exe。如果在一般的已知路径中未找到ntsd.exe,!bpid不能成功的设置适当的PID。注意在Windows Vista中默认不包含ntsd.exe。

    !btb

    !btb 扩展显示Itanium处理器、分支跟踪缓存(branch traces buffer (BTB))配置、以及当前处理器上的跟踪寄存器(trace registers)。

    语法

    !btb 

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    该扩展命令只能在Itanium目标机上使用。

    !bth

    ]!bth 扩展显示指定处理器上的Itanium分支跟踪记录。

    语法

    !bth [Processor

    参数

    Processor

    指定处理器。如果省略Processo,则显示所有处理器上的分支跟踪记录(branch trace history)。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll

    该扩展命令只能在Itanium目标机上使用。

    !bugdump

    !bugdump 扩展命令格式化并显示在bug check回调缓冲区(bug check callback buffers)中的信息。

    语法

    !bugdump [Component

    参数

    Component

    指定要查看回调数据的组件。如果省略,则显示所有的bug check回调数据。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP 和之后

    Kdexts.dll

    注释

    该扩展仅在发生了bug check之后,或者调试内核模式dump文件时使用。

    Component 参数对应KeRegisterBugCheckCallback 使用的最后一个参数。

    小内存转储中不包含回调数据的缓冲区。这些缓冲区仅在内核内存转储和完整内存转储中存在。但是,在Windows XP SP1、Windows Server 2003和之后版本的Windows中,dump文件是在驱动的BugCheckCallback 被调用之前创建的,所以这些缓冲区中不会包含由这些函数写入的数据。

    如果对崩溃的系统进行活动调试,则存在所有的回调数据。

    附加信息

    更多信息,查看读取Bug Check回调数据

    !bushnd

    !bushnd 扩展显示HAL BUS_HANDLER结构。

    语法

    !bushnd [Address

    参数

    Address

    指定HAL BUS_HANDLER 结构的16进制地址。如果省略,!bushnd 显示总线的列表以及handler 的基地址。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP 和之后

    Kdexts.dll

    WinDbg 文档翻译----73

    cc682/NetRoc

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

    !mui

    !mui 扩展命令显示多语言用户接口(Multilingual User Interface (MUI))缓存信息。MUI的实现在Windows Vista中被显著的改良了。所以该功能在早期的实现上可能是不明确的。

    语法

    用户模式语法

    !mui –c
    !mui –f
    !mui -i
    !mui -r ModuleAddress
    !mui -t
    !mui -? 

    内核模式语法

    !mui -c
    !mui –f
    !mui -i
    !mui -s
    !mui -r ModuleAddress
    !mui -t
    !mui -? 

    参数

    -c

    输出中包含语言标识符(language identifier (ID))、指向模块的指针、指向资源配置数据(resource configuration data)的指针、以及指向每个模块关联的MUI DLL的指针。

    -f

    输出中包含加载器合并的语言后备列表(loader merged language fallback list)。

    -i

    输出中包含已安装和授权的MUI语言,以及它们的关联信息。

    -r ModuleAddress

    显示ModuleAddress 模块的资源配置数据(resource configuration data)。包括文件类型、校验和的值、以及资源类型。

    -s

    (仅内核模式) 输出中包含模块和每个模块关联的MUI DLL的完整路径。

    -t

    输出中包含线程的首选语言(preference language)。

    -?

    在调试器命令窗口中显示该扩展命令的简要帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP

    不可用

    Windows Vista 和之后

    Exts.dll

     

    附加信息

    关于MUI和资源配置数据格式(resource configuration data format)的更多信息,查看Microsoft Windows SDK 文档。

    !net_send

    !net_send 扩展通过本地网络发送一条消息。

    语法

    !net_send SendingMachine TargetMachine Sender Message 

    参数

    SendingMachine

    指定要处理该命令的计算机。建议使用调试器所运行的计算机的名字,因为网络配置可能会拒绝发送这条消息。SendingMachine 不能在开头包括反斜线(\)。

    TargetMachine

    指定发送消息的对象。TargetMachine 不能在开头包含反斜线(\)。

    Sender

    指定消息的发送者。建议Sender SendingMachine 一样,因为网络配置可能会拒绝发送该消息。当这条消息被显示出来时,该字符串会作为消息的发送者。

    Message

    指定消息本身。Sender 参数后面的所有文本都会被当作Message 的一部分,包括空格和引号,分号会结束Message并且开始一条新的命令。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    !obja

    !obja 扩展命令显示对象管理器中某个对象的属性。

    语法

    !obja Address 

    参数

    Address

    指定要查看的对象头的16进制地址。

    DLL

    Windows NT 4.0

    Ext.dll 
    Kdextx86.dll

    Windows 2000

    Ext.dll 
    Kdextx86.dll

    Windows XP和之后

    Ext.dll

    注释

    指定对象所具备的属性会被列举出来。合法的属性包括:

    #define OBJ_INHERIT             0x00000002L
    #define OBJ_PERMANENT           0x00000010L
    #define OBJ_EXCLUSIVE           0x00000020L
    #define OBJ_CASE_INSENSITIVE    0x00000040L
    #define OBJ_OPENIF              0x00000080L
    #define OBJ_OPENLINK            0x00000100L
    #define OBJ_VALID_ATTRIBUTES    0x000001F2L

    下面是一个示例:

    kd> !obja 80967768
    Obja +80967768 at 80967768:
            OBJ_INHERIT
            OBJ_PERMANENT
            OBJ_EXCLUSIVE

    附加信息

    关于对象和对象管理器的更多信息,查看Microsoft Windows SDK 文档、Windows Driver Kit (WDK) 文档、以及Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals

    !owner

    !owner 扩展用于显示某个模块或者函数的所有者。

    语法

    !owner [Module[!Symbol]] 

    参数

    Module

    指定要查看所有者的模块。Module 后面如果带一个星号(*),则表示任意多个其他字符。

    Symbol

    指定要查看所有者的Module 模块中的符号。Symbol 后如果带一个星号 (*) ,表示任意多个其他字符。如果省略Symbol ,则显示整个模块的所有者。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    如果没有使用参数并且发生了错误,!owner 会显示发生错误的模块或函数的所有者名字。

    传递了模块或函数名给!owner 时,调试器会显示单词 Followup ,后面跟指定的模块或函数的所有者。

    要该命令显示有用的信息,必须首先创建包含模块和函数所有者名字的triage.ini 文件。

    triage.ini 文件的详细信息和!owner 命令的示例,查看指定模块和函数的所有者

    !peb

    !peb 扩展显示进程环境块(PEB)信息的格式化形式。

    语法

    !peb [PEB-Address

    参数

    PEB-Address

    要查看的PEB的16进制地址。(不是从进程的内核进程块中获得的PEB地址。) 如果在用户模式下省略PEB-Address,则使用当前进程的PEB。如果在内核模式下省略,则显示当前进程上下文对应的PEB。

    DLL

    Windows NT 4.0

    Kdextx86.dll 
    Ntsdexts.dll

    Windows 2000

    Kdextx86.dll 
    Ntsdexts.dll

    Windows XP和之后

    Exts.dll

    注释

    PEB是Microsoft Windows进程控制结构的用户模式部分。

    如果内核模式下不带参数使用!peb 命令时出错,则需要用!process扩展命令来 获得需要的进程的PEB地址。 要确认进程上下文是设置成需要的进程的,并且将该PEB地址作为!peb的参数。

    具体显示出来的输出根据不同的Windows版本以及是在内核模式还是用户模式下调试会有所不同。下面是一个附加到Windows Server 2003目标机上的内核调试器的输出示例:

    kd> !peb
    PEB at 7ffdf000
        InheritedAddressSpace:    No
        ReadImageFileExecOptions: No
        BeingDebugged:            No
        ImageBaseAddress:         4ad00000
        Ldr                       77fbe900
        Ldr.Initialized:          Yes
        Ldr.InInitializationOrderModuleList: 00241ef8 . 00242360
        Ldr.InLoadOrderModuleList:           00241e90 . 00242350
        Ldr.InMemoryOrderModuleList:         00241e98 . 00242358
                Base TimeStamp                     Module
            4ad00000 3d34633c Jul 16 11:17:32 2002 D:WINDOWSsystem32cmd.exe
            77f40000 3d346214 Jul 16 11:12:36 2002 D:WINDOWSsystem32 tdll.dll
            77e50000 3d3484ef Jul 16 13:41:19 2002 D:WINDOWSsystem32kernel32.dll
    ....
        SubSystemData:     00000000
        ProcessHeap:       00140000
        ProcessParameters: 00020000
        WindowTitle:  'D:Documents and SettingsAdministratorDesktopDebuggers.lnk'
        ImageFile:    'D:WINDOWSsystem32cmd.exe'
        CommandLine:  '"D:WINDOWSsystem32cmd.exe" '
        DllPath:      'D:WINDOWSsystem32;D:WINDOWSsystem32;....
        Environment:  00010000
            ALLUSERSPROFILE=D:Documents and SettingsAll Users
            APPDATA=D:Documents and SettingsUserTwoApplication Data
            CLIENTNAME=Console
    ....
            windir=D:WINDOWS

    类似的!teb 扩展命令用于显示线程环境块。

    附加信息

    关于进程环境块的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !psr

    !psr 扩展显示Itanium处理器状态字(processor status word (PSR))。

    语法

    !psr PSR [DisplayLevel
    !psr @ipsr [DisplayLevel

    参数

    PSR

    指定要显示的PSR的16进制地址。

    @ipsr

    显示ipsr寄存器。

    DisplayLevel

    可以使下面选项中任意一个:

    0

    只显示每个PSR字段(field)的值。这是默认情况。

    1

    显示中包含非保留或者忽略的PSR字段的更深入的信息。

    2

    显示中包含所有的PSR字段的深入信息,包括忽略和保留(ignored or reserved)的那些。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Exts.dll

    该命令只能在Itanium的目标机上使用。

    注释

    下面是两个例子:

    0:000> !psr @ipsr
    psr:ia bn ed ri ss dd da id it mc is cpl rt tb lp db
     0  1  0  0  0  0  0  0  1  0  0  3   1  0  0  0
    si di pp sp dfh dfl dt pk i ic | mfh mfl ac up be
     0  0  1  0  0   0   1  0 1  1 |  0   1   0  0  0

    kd> !psr @ipsr 1

      be : 0 : Big-Endian
      up : 0 : User Performance monitor enable
      ac : 1 : Alignment Check
     mfl : 1 : Lower floating-point registers written
     mfh : 0 : Upper floating-point registers written
      ic : 1 : Interruption Collection
       i : 0 : Interrupt enable
      pk : 0 : Protection Key enable
      dt : 1 : Data Address Translation enable
     dfl : 0 : Disabled Floating-point Low  register set
     dfh : 1 : Disabled Floating-point High register set
      sp : 0 : Secure Performance monitors
      pp : 1 : Privileged Performance monitor enable
      di : 0 : Disable Instruction set transition
      si : 0 : Secure Interval timer
      db : 0 : Debug Breakpoint fault enable
      lp : 0 : Lower Privilege transfer trap enable
      tb : 0 : Taken Branch trap enable
      rt : 1 : Register stack translation enable
     cpl : 0 : Current Privilege Level
      is : 0 : Instruction Set
      mc : 0 : Machine Abort Mask delivery disable
      it : 1 : Instruction address Translation enable
      id : 0 : Instruction Debug fault disable
      da : 0 : Disable Data Access and Dirty-bit faults
      dd : 0 : Data Debug fault disable
      ss : 0 : Single Step enable
      ri : 0 : Restart Instruction
      ed : 0 : Exception Deferral
      bn : 1 : register Bank
      ia : 0 : Disable Instruction Access-bit faults

    附加信息

    更多信息,查看Itanium 架构,或者Intel架构手册。

    !rtlavl

    !rtlavl 扩展显示某个RTL_AVL_TABLE 结构的条目。

    语法

    !rtlavl Address [Module!Type]
    !rtlavl -?

    参数

    Address

    指定要显示的RTL_AVL_TABLE 的地址。

    Module

    指定定义该数据结构的模块。

    Type

    指定数据结构的名字。

    -?

    在调试器命令窗口中显示该命令的简要帮助文本。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    包含Module!Type 选项会使得列表中每个条目都被当成给定类型的。

    任何时候通过按下CTRL+BREAK (WinDbg中) 或者CTRL+C (KD 或CDB中)都可以打断命令的输出。

    附加信息

    使用!gentable 扩展命令来显示AVL表。

    !sd

    !sd 显示指定地址处的安全描述符(security descriptor)。

    语法

    Windows NT 4.0 和Windows 2000中的语法:

    !sd Address 

    Windows XP和之后的语法:

    !sd Address [Flags

    参数

    Address

    指定SECURITY_DESCRIPTOR 结构的16进制地址。

    Flags

    (Windows XP 和之后) 如果设置为1,则显示更友好的名字。包括安全描述符(security identifier (SID))类型,以及该SID的域(domain)和用户名。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Exts.dll

    注释

    这里有一个例子:

    kd> !sd e1a96a80 1
    ->Revision: 0x1
    ->Sbz1    : 0x0
    ->Control : 0x8004
                SE_DACL_PRESENT
                SE_SELF_RELATIVE
    ->Owner   : S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAINmyuser)
    ->Group   : S-1-5-21-518066528-515770016-299552555-513 (Group: MYDOMAINDomain Users)
    ->Dacl    :
    ->Dacl    : ->AclRevision: 0x2
    ->Dacl    : ->Sbz1       : 0x0
    ->Dacl    : ->AclSize    : 0x40
    ->Dacl    : ->AceCount   : 0x2
    ->Dacl    : ->Sbz2       : 0x0
    ->Dacl    : ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
    ->Dacl    : ->Ace[0]: ->AceFlags: 0x0
    ->Dacl    : ->Ace[0]: ->AceSize: 0x24
    ->Dacl    : ->Ace[0]: ->Mask : 0x001f0003
    ->Dacl    : ->Ace[0]: ->SID: S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAINmyuser)

    ->Dacl    : ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
    ->Dacl    : ->Ace[1]: ->AceFlags: 0x0
    ->Dacl    : ->Ace[1]: ->AceSize: 0x14
    ->Dacl    : ->Ace[1]: ->Mask : 0x001f0003
    ->Dacl    : ->Ace[1]: ->SID: S-1-5-18 (Well Known Group: NT AUTHORITYSYSTEM)

    ->Sacl    :  is NULL

    附加信息

    关于该命令的应用和例子,查看查看对象的ACL。关于安全描述符的更多信息,查看 Microsoft Windows SDK文档、 Windows Driver Kit (WDK)文档、以及Mark Russinovich和David Solomon编写的 Microsoft Windows Internals。还可以参见!sid !acl

    !sid

    !sid 扩展显示指定地址处的安全描述符 (SID)。

    语法

    Windows NT 4.0 和Windows 2000的语法:

    !sid Address 

    Windows XP和之后的系统中的语法:

    !sid Address [Flags

    参数

    Address

    指定SID结构的地址。

    Flags

    (Windows XP和之后) 如果设置为1,则SID类型、域和该SID的用户名都会显示出来。

    (Windows XP and later) 如果设置为1,则显示更加友好的名字。包括安全描述符(SID)类型,以及该SID的域(domain)和用户名。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Exts.dll

    注释

    这里有两个示例,一个没有显示友好名,一个有显示:

    kd> !sid 0xe1bf35b8
    SID is: S-1-5-21-518066528-515770016-299552555-513

    kd> !sid 0xe1bf35b8 1
    SID is: S-1-5-21-518066528-515770016-299552555-513 (Group: MYGROUPDomain Users)

    附加信息

    关于SID的更多信息,查看Microsoft Windows SDK 文档、Windows Driver Kit (WDK)文档,或者Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals 。也可以参见!sd !acl

    !slist

    !slist 扩展显示一个单链表(singly-linked list (SList))。

    语法

    !slist Address [ Symbol [Offset] ] 
    !slist -? 

    参数

    Address

    指定SLIST_HEADER 的地址。

    Symbol

    指定要用来显示的数据类型。如果指定了Symbol,调试器显示的时候会假定单链表中每个实例具有该数据类型。

    Offset

    指定单链表指针在该结构中的字节偏移。

    -?

    在调试器命令窗口中显示该命令的简要帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Exts.dll

    注释

    如果知道链接的结构的类型,那么Symbol Offset 参数是非常有用的。要查看区别,这里有两个例子;第一个省略了Symbol Offset 参数,第二个包含了。

    0:000> !slist ListHead
    SLIST HEADER:
       +0x000 Alignment          : a000a002643e8
       +0x000 Next               : 2643e8
       +0x004 Depth              : a
       +0x006 Sequence           : a

    SLIST CONTENTS:
    002643e8  002642c0 0000000a 6e676953 72757461
    002642c0  00264198 00000009 6e676953 72757461
    00264198  00264070 00000008 6e676953 72757461
    00264070  00263f48 00000007 6e676953 72757461
    00263f48  00261420 00000006 6e676953 72757461
    00261420  002612f8 00000005 6e676953 72757461
    002612f8  002611d0 00000004 6e676953 72757461
    002611d0  002610a8 00000003 6e676953 72757461
    002610a8  00260f80 00000002 6e676953 72757461
    00260f80  00000000 00000001 6e676953 72757461

    0:000> !slist ListHead _PROGRAM_ITEM 0
    SLIST HEADER:
       +0x000 Alignment          : a000a002643e8
       +0x000 Next               : 2643e8
       +0x004 Depth              : a
       +0x006 Sequence           : a

    SLIST CONTENTS:
    002643e8
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 0xa
       +0x008 Description      : [260]  "Signature is: 10"
    002642c0
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 9
       +0x008 Description      : [260]  "Signature is: 9"
    00264198
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 8
       +0x008 Description      : [260]  "Signature is: 8"
    00264070
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 7
       +0x008 Description      : [260]  "Signature is: 7"
    00263f48
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 6
       +0x008 Description      : [260]  "Signature is: 6"
    00261420
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 5
       +0x008 Description      : [260]  "Signature is: 5"
    002612f8
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 4
       +0x008 Description      : [260]  "Signature is: 4"
    002611d0
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 3
       +0x008 Description      : [260]  "Signature is: 3"
    002610a8
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 2
       +0x008 Description      : [260]  "Signature is: 2"
    00260f80
       +0x000 ItemEntry        : _SINGLE_LIST_ENTRY
       +0x004 Signature        : 1
       +0x008 Description      : [260]  "Signature is: 1"

    7月16日

    WinDbg 文档翻译----74

    cc682/NetRoc

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

    !std_map

    !std_map 扩展用来显示std::map 树的内容。

    语法

    !std_map Address [Module!Type [TypeSize]]
    !std_map -?

    参数

    Address

    指定要显示的std::map 树的地址。

    Module

    指定定义该数据结构的模块。

    Type

    指定数据结构的名字。必须是明确的Module!std::pair<Type1,Type2> 格式。如果使用了TypeSize参数,则这个参数必须包含在引号中。

    TypeSize

    指定数据结构的大小,以使得符号更加明确。

    -?

    在调试器命令窗口中显示该扩展的简短帮助文本。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    包含Module!Type 选项使得表中的每个条目都被当作给定类型。

    使用dt -ve (Module!std::pair<Type1,Type2>) 来显示可能的大小。

    附加信息

    要显示其它标准模板库 (STL)定义的模板,查看 !stl

    !stl

    !stl 扩展命令显示一些已知的标准模板库(STL)的模板。

    语法

    !stl [OptionsTemplate 
    !stl -? 

    参数

    Options

    可以包含任意的下面这些选项:

    -v

    显示详细输出。

    -V

    显示更加详细的输出,例如包含特定函数何时被调用以及何时返回这样的扩展命令执行过程的信息。

    Template

    指定要显示的模板的名字。

    -?

    在调试器命令窗口中显示简要的命令帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Exts.dll

    注释

    只有在调试器的详细输出模式打开之后,详细输出的选项才能起作用。

    该扩展命令当前支持的STL模板包括:string wstring vector<string> vector<wstring> list<string> list<wstring>、以及任何指向前面这几个类型的指针。

    !str

    !str 扩展命令显示ANSI_STRING 或OEM_STRING 结构。

    语法

    !str Address 

    参数

    Address

    指定ANSI_STRING 或OEM_STRING 结构的16进制地址。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    ANSI 字符串包含的是8位的字符,用下面的结构定义:

    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
    typedef STRING ANSI_STRING;
    typedef STRING OEM_STRING;

    如果字符串是NULL结尾的,Length 不能包含尾部的NULL。

    附加信息

    关于ANSI_STRING 结构的更多信息,查看Microsoft Windows SDK文档。

    !sym

    !sym 扩展控制显示详细的符号加载和符号提示。

    语法

    !sym 
    !sym noisy 
    !sym quiet 
    !sym prompts 
    !sym prompts off 

    参数

    noisy

    激活详细符号加载(noisy symbol loading)。

    quiet

    禁止详细符号加载。

    prompts

    当SymSrv 接收到认证请求时,允许弹出对话框。

    prompts off

    禁止SymSrv 在接收到认证请求时显示认证对话框。这可能使得SymSrv 不能通过internet访问符号。

    DLL

    Windows NT 4.0

    Dbghelp.dll

    Windows 2000

    Dbghelp.dll

    Windows XP和之后

    Dbghelp.dll

    注释

    如果不带参数使用!sym ,则显示当前的详细符号加载和符号提示的设置状态。

    !sym noisy !sym quiet 扩展命令用来控制详细符号加载。关于其它显示和修改该选项的方法,查看SYMOPT_DEBUG

    !sym prompts !sym prompts off 扩展用来控制SymSrv接收到认证请求时是否弹出认证对话框。这些命令之后必须再使用.reload (Reload Module) 才能起效。认证请求可能是由代理服务器、internet防火墙、智能卡读卡器(smart card readers),以及安全页面(secure websites)发起的。关于其它显示和修改该选项的方法,查看防火墙和代理服务器

    注意  详细符号加载不能和详细源码加载混淆 — 它是使用.srcnoisy (Noisy Source Loading) 命令来控制的。

    !symsrv

    !symsrv 命令关闭符号服务器客户端(symbol server client)。

    语法

    !symsrv close 

    DLL

    Windows NT 4.0

    Dbghelp.dll

    Windows 2000

    Dbghelp.dll

    Windows XP和之后

    Dbghelp.dll

    注释

    !symsrv close 会关闭任何活动的符号服务器客户端。

    这在重新同步连接时有用。

    如果之前拒绝过internet的认证请求,需要使用!symsrv close来重新连接符号存储。查看 防火墙和代理服务器获得详细信息。

    !teb

    !teb 扩展以的格式化后的形式显示线程环境块(TEB)的信息。

    语法

    !teb [TEB-Address

    参数

    TEB-Address

    要查看的TEB 的16进制地址。(这不是从该线程在内核的线程块中获得的TEB。) 如果在用户模式下省略TEB-Address,则使用当前进程的TEB。如果在内核模式下省略,则显示当前寄存器上下文对应的TEB。

    DLL

    Windows NT 4.0

    Kdextx86.dll 
    Ntsdexts.dll

    Windows 2000

    Kdextx86.dll 
    Ntsdexts.dll

    Windows XP和之后

    Exts.dll

    注释

    TEB是用户模式下的Microsoft Windows线程控制结构。

    如果在内核模式下不带参数使用 !teb 出现错误,则应该用!process扩展来查看需要的线程的TEB地址。确认寄存器上下文是设置成需要的线程的,然后再将该TEB地址用作!teb 的参数。

    下面是在用户模式下使用该命令的一个例子:

    0:001> ~
       0  id: 324.458   Suspend: 1 Teb 7ffde000 Unfrozen
    .  1  id: 324.48c   Suspend: 1 Teb 7ffdd000 Unfrozen

    0:001> !teb 
    TEB at 7FFDD000
        ExceptionList:    76ffdc
        Stack Base:       770000
        Stack Limit:      76f000
        SubSystemTib:     0
        FiberData:        1e00
        ArbitraryUser:    0
        Self:             7ffdd000
        EnvironmentPtr:   0
        ClientId:         324.48c
        Real ClientId:    324.48c
        RpcHandle:        0
        Tls Storage:      0
        PEB Address:      7ffdf000
        LastErrorValue:   0
        LastStatusValue:  0
        Count Owned Locks:0
        HardErrorsMode:   0

    类似的 !peb 扩展命令用于显示进程环境块。

    附加信息

    关于线程环境块的更多信息,查看Mark Russinovich 和David Solomon 编著的Microsoft Windows Internals 

    !tls

    !tls 扩展命令用于显示一个线程本地存储槽(TLS slot)。

    语法

    !tls Slot [TEB

    参数

    Slot

    指定TLS slot。可以是0到1088之间的任何10进制值。如果Slot 是-1,则显示所有slot。

    TEB

    指定线程环境块(TEB)。如果为0或者省略,则使用当前线程。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Exts.dll

    注释

    这里有一个例子:

    0:000> !tls -1
    TLS slots on thread: c08.f54
    0x0000 : 00000000
    0x0001 : 003967b8
    0:000> !tls 0
    c08.f54: 00000000

    !token

    !token 扩展命令用来显示格式化后的安全令牌对象(security token object)的信息。

    语法

    Windows NT 4.0 和Windows 2000的语法 (内核模式)

    !token [Address

    Windows XP和之后系统中,内核模式:

    !token [-n] [Address
    !token -? 

    Windows XP和之后系统,用户模式:

    !token [-n] [Handle
    !token -? 

    参数

    Address

    (仅内核模式) 指定要显示的令牌的地址。如果为0 或省略,则显示活动线程的令牌。

    Handle

    (仅用户模式) 指定要显示的令牌的句柄。如果为0或者省略,则显示目标进程关联的令牌。

    -n

    (Windows XP 和之后;仅用户模式) 显示更加友好的名字。包括安全描述符(SID)类型,以及SID的域和用户名。该选项在调试LSASS时不能使用。

    -?

    (Windows XP 和之后) 在调试器命令窗口中显示简要的命令帮助文本。

    DLL

    Windows NT 4.0

    Kdextx86.dll

    Windows 2000

    Kdextx86.dll

    Windows XP和之后

    Exts.dll

    在Windows NT 4.0 和Windows 2000中, !token仅在内核调试时可用。在Windows XP和之后的操作系统中, !token 可以在内核调试和用户模式活动调试时使用。调试用户模式dump文件时不能使用。

    注释

    TOKEN 结构用来代表一个已认证的用户进程的安全对象类型。每个进程都被指派了一个令牌,作为该进程中所有线程的默认令牌。但是每个单独线程都可以指派一个令牌来重载默认的那个。

    可以从!process的输出中得到令牌的地址。要显示TOKEN结构的每个单独字段的清单,可以在Windows NT 4.0或者Windows 2000中使用 !tokenfields 扩展命令,或者在Windows XP或之后的系统中使用 dt nt!_TOKEN 命令。

    下面是一个例子:

    kd> !process 81464da8 1
    PROCESS 81464da8  SessionId: 0  Cid: 03bc    Peb: 7ffdf000  ParentCid: 0124
        DirBase: 0dec2000  ObjectTable: e1a31198  TableSize: 275.
        Image: MSMSGS.EXE
        VadRoot 81468cc0 Vads 170 Clone 0 Private 455. Modified 413. Locked 0.
        DeviceMap e1958438
        Token                             e1bed030
        ElapsedTime                       0:44:15.0142
        UserTime                          0:00:00.0290
        KernelTime                        0:00:00.0300
        QuotaPoolUsage[PagedPool]         49552
        QuotaPoolUsage[NonPagedPool]      10872
        Working Set Sizes (now,min,max)  (781, 50, 345) (3124KB, 200KB, 1380KB)
        PeakWorkingSetSize                1550
        VirtualSize                       57 Mb
        PeakVirtualSize                   57 Mb
        PageFaultCount                    2481
        MemoryPriority                    BACKGROUND
        BasePriority                      8
        CommitCharge                      2497
    kd> !exts.token -n e1bed030
    _TOKEN e1bed030
    TS Session ID: 0
    User: S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAINmyuser)
    Groups:
     00 S-1-5-21-518066528-515770016-299552555-513 (Group: MYDOMAINDomain Users)
        Attributes - Mandatory Default Enabled
     01 S-1-1-0 (Well Known Group: localhostEveryone)
        Attributes - Mandatory Default Enabled
     02 S-1-5-32-544 (Alias: BUILTINAdministrators)
        Attributes - Mandatory Default Enabled Owner
     03 S-1-5-32-545 (Alias: BUILTINUsers)
        Attributes - Mandatory Default Enabled
     04 S-1-5-21-518066528-515770016-299552555-2999049 (Group: MYDOMAINAllUsers)
        Attributes - Mandatory Default Enabled
     05 S-1-5-21-518066528-515770016-299552555-2931095 (Group: MYDOMAINSomeGroup1)
        Attributes - Mandatory Default Enabled
     06 S-1-5-21-518066528-515770016-299552555-2931096 (Group: MYDOMAINSomeGroup2)
        Attributes - Mandatory Default Enabled
     07 S-1-5-21-518066528-515770016-299552555-3014318 (Group: MYDOMAINSomeGroup3)
        Attributes - Mandatory Default Enabled
     08 S-1-5-21-518066528-515770016-299552555-3053352 (Group: MYDOMAINAnother Group)
        Attributes - Mandatory Default Enabled
     09 S-1-5-21-518066528-515770016-299552555-2966661 (Group: MYDOMAINTestGroup)
        Attributes - Mandatory Default Enabled
     10 S-1-5-21-2117033040-537160606-1609722162-17637 (Group: MYOTHERDOMAINsomeusers)
        Attributes - Mandatory Default Enabled
     11 S-1-5-21-518066528-515770016-299552555-3018354 (Group: MYDOMAINTestGroup2)
        Attributes - Mandatory Default Enabled
     12 S-1-5-21-518066528-515770016-299552555-3026602 (Group: MYDOMAINSomeGroup4)
        Attributes - Mandatory Default Enabled
     13 S-1-5-21-518066528-515770016-299552555-2926570 (Group: MYDOMAINYetAnotherGroup)
        Attributes - Mandatory Default Enabled
     14 S-1-5-21-661411660-2927047998-133698966-513 (Group: MYDOMAINDomain Users)
        Attributes - Mandatory Default Enabled
     15 S-1-5-21-518066528-515770016-299552555-2986081 (Alias: MYDOMAINan_alias)
        Attributes - Mandatory Default Enabled GroupResource
     16 S-1-5-21-518066528-515770016-299552555-3037986 (Alias: MYDOMAINAReallyLongGroupName1)
        Attributes - Mandatory Default Enabled GroupResource
     17 S-1-5-21-518066528-515770016-299552555-3038991 (Alias: MYDOMAINAReallyLongGroupName2)
        Attributes - Mandatory Default Enabled GroupResource
     18 S-1-5-21-518066528-515770016-299552555-3037999 (Alias: MYDOMAINAReallyLongGroupName3)
        Attributes - Mandatory Default Enabled GroupResource
     19 S-1-5-21-518066528-515770016-299552555-3038983 (Alias: MYDOMAINAReallyReallyLongGroupName)
        Attributes - Mandatory Default Enabled GroupResource
     20 S-1-5-5-0-71188 (no name mapped)
        Attributes - Mandatory Default Enabled LogonId
     21 S-1-2-0 (Well Known Group: localhostLOCAL)
        Attributes - Mandatory Default Enabled
     22 S-1-5-4 (Well Known Group: NT AUTHORITYINTERACTIVE)
        Attributes - Mandatory Default Enabled
     23 S-1-5-11 (Well Known Group: NT AUTHORITYAuthenticated Users)
        Attributes - Mandatory Default Enabled
    Primary Group: S-1-5-21-518066528-515770016-299552555-513 (Group: MYDOMAINDomain Users)
    Privs:
     00 0x000000017 SeChangeNotifyPrivilege           Attributes - Enabled Default
     01 0x000000008 SeSecurityPrivilege               Attributes -
     02 0x000000011 SeBackupPrivilege                 Attributes -
     03 0x000000012 SeRestorePrivilege                Attributes -
     04 0x00000000c SeSystemtimePrivilege             Attributes -
     05 0x000000013 SeShutdownPrivilege               Attributes -
     06 0x000000018 SeRemoteShutdownPrivilege         Attributes -
     07 0x000000009 SeTakeOwnershipPrivilege          Attributes -
     08 0x000000014 SeDebugPrivilege                  Attributes -
     09 0x000000016 SeSystemEnvironmentPrivilege      Attributes -
     10 0x00000000b SeSystemProfilePrivilege          Attributes -
     11 0x00000000d SeProfileSingleProcessPrivilege   Attributes -
     12 0x00000000e SeIncreaseBasePriorityPrivilege   Attributes -
     13 0x00000000a SeLoadDriverPrivilege             Attributes - Enabled
     14 0x00000000f SeCreatePagefilePrivilege         Attributes -
     15 0x000000005 SeIncreaseQuotaPrivilege          Attributes -
     16 0x000000019 SeUndockPrivilege                 Attributes - Enabled
     17 0x00000001c SeManageVolumePrivilege           Attributes -
    Authentication ID:         (0,11691)
    Impersonation Level:       Anonymous
    TokenType:                 Primary
    Source: User32             TokenFlags: 0x9 ( Token in use )
    Token ID: 18296            ParentToken ID: 0
    Modified ID:               (0, 18298)
    RestrictedSidCount: 0      RestrictedSids: 00000000

    附加信

    关于内核模式TOKEN结构的更多信息,查看Mark Russinovich 和David Solomon编写的Microsoft Windows Internals。用户模式下TOKEN结构的更多信息,查看Microsoft Windows SDK 文档。

    !tp

    !tp 扩展用于显示线程池的信息。

    语法

    !tp pool Address [Flags]
    !tp tqueue Address [Flags]
    !tp ItemType Address [Flags]
    !tp ThreadType [Address]
    !tp -? 

    参数

    Address

    指定一个地址。

    pool

    显示位于Address 的整个线程池。如果Address是0,则显示所有的线程池。

    tqueue

    显示位于Address 的活动定时器队列(active timer queue)。

    ItemType

    指定要显示的线程池项(item)的类型。ItemType可以包含任意的下面这些可能的值:

    obj

    显示常规的内存池项 (例如IO项)。

    timer

    显示定时器项。

    wait

    显示等待项(wait item)。

    work

    显示工作项(work item)。

    ThreadType

    指定要显示的线程的类型。如果包含了Address,则只会显示该地址处的线程。 如果Address 为0,则指定类型的所有线程都会显示出来。如果省略Address,只显示当前线程(疑为进程 — 译者)关联的线程。ThreadType 可以包含任意下面这些可能的值:

    waiter

    显示线程池等待者线程(thread pool waiter thread)。

    worker

    显示线程池工作者线程(thread pool worker thread)。

    Flags

    指定显示中要包含的内容。可以是下面这些位值的和 (默认值为0x0):

    Bit 0 (0x1)

    单行显示。当显示ItemType 时,这一位的设置无效。

    Bit 1 (0x2)

    显示中包含成员信息(member information)。

    Bit 2 (0x4)

    显示中包含池工作队列(pool work queue)。这一位只有使用pool标志时才有意义。

    -?

    在调试器命令窗口中显示该扩展命令的简单帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP和之后

    Exts.dll

    附加信息

    关于线程池的更多信息,查看Microsoft Windows SDK 文档。

    !triage

    !triage 扩展命令已经废除。使用!analyze 来替代。

    !ustr

    !ustr 扩展命令显示UNICODE_STRING结构。

    语法

    !ustr Address 

    参数

    Address

    指定UNICODE_STRING 结构的16进制地址。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP和之后

    Ext.dll

    注释

    Unicode 字符串是由16位字符组成的,下面是结构的定义:

    typedef struct _UNICODE_STRING {
        USHORT Length;
        USHORT MaximumLength;
        PWSTR  Buffer;
    } UNICODE_STRING;

    如果字符串是NULL结尾,则Length 不能包含NULL字符。

    大多数Win32字符串参数在实际使用前都会转换成Unicode字符串。

    附加信息

    UNICODE_STRING 结构的更多信息,查看Microsoft Windows SDK文档。

    !version

    !version 扩展命令显示扩展DLL的版本信息。

    该命令不能和 version (Show Debugger Version) 命令混淆。

    语法

    ![ExtensionDLL.]version 

    参数

    ExtensionDLL

    指定要显示版本号的扩展DLL。

    DLL

    大多数扩展DLL都支持该命令。

    注释

    如果扩展DLL的版本和调试器版本不匹配,则会显示错误信息。

    该命令在Windows XP和之后版本的Windows中都不支持。要显示版本信息,应该使用version (Show Debugger Version) 命令。

    该扩展命令原本的意图是用来确认DLL版本和目标版本匹配,因为在很多扩展中版本不匹配都会造成错误的结果。新的DLL不再限制为只支持一个版本的Windows,所以这个扩展命令已经废除。

    7月15日

    WinDbg 文档翻译----72

    cc682/NetRoc

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

    !help

    !help 命令显示扩展DLL中的扩展命令的帮助文本。

    不要将该命令和? (Command Help) .help (Meta-Command Help)混淆。

    语法

    ![ExtensionDLL.]help [-v] [CommandName

    参数

    ExtensionDLL

    显示指定的扩展DLL的帮助。使用不带.dll扩展名的文件名。如果该DLL不在扩展搜索路径 (使用.chain (List Debugger Extensions)来显示)中,则需要包含路径。例如,要显示uext.dll的帮助,需要输入!uext.help !Pathwinextuext.help

    如果省略ExtensionDLL,调试器将显示已加载的扩展DLL列表中第一个的帮助文本。

    -v

    尽可能显示最详细的帮助文本。该功能可能不是每个DLL都支持。

    CommandName

    仅显示指定命令的帮助文本。不是所有DLL都支持该功能。

    DLL

    大多数扩展DLL都支持这条命令。

    注释

    一些命令本身也可以在使用/?或者-? 参数时显示帮助文本。

    !homedir

    !homedir 设置符号服务器和源码服务器使用的默认目录。

    语法

    !homedir Directory 
    !homedir 

    参数

    Directory

    指定要设置为主目录的新目录。

    DLL

    Windows NT 4.0

    Dbghelp.dll

    Windows 2000

    Dbghelp.dll

    Windows XP 和之后

    Dbghelp.dll

    注释

    如果不带参数使用!homedir ,则显示当前的主目录。

    如果没有特别指定的话,符号服务器的缓存位于主目录下的src 子目录。符号服务器的下游存储默认是在主目录下的sym子目录。

    WinDbg启动时,主目录是Windows调试工具包安装目录。!homedir可以用来改变这个值。

    !htrace

    !htrace 扩展用于显示一个或多个句柄的堆栈回溯信息。

    语法

    用户模式语法

    !htrace [Handle [Max_Traces]] 
    !htrace -enable [Max_Traces]
    !htrace -snapshot
    !htrace -diff
    !htrace -disable
    !htrace -? 

    内核模式语法

    !htrace [Handle [Process [Max_Traces]]] 
    !htrace -? 

    参数

    Handle

    指定要显示堆栈回溯的句柄。如果Handle 为0 或者省略,则显示进程中所有句柄的堆栈回溯。

    Process

    (仅内核模式) 指定要显示句柄的进程。如果Process 为0或者省略,则使用当前进程。用户模式下总是使用当前进程。

    Max_Traces

    指定要显示的堆栈回溯的最大层数。用户模式下如果省略该参数,则显示目标进程中的所有堆栈回溯。

    -enable

    (仅用户模式) 启用句柄跟踪,并且为-diff 选项使用的初始状态产生第一次句柄信息的快照。

    -snapshot

    (仅用户模式) 抓取当前的句柄信息的快照用作-diff 选项的初始状态。

    -diff

    (仅用户模式) 将当前的句柄信息和上一次句柄快照的信息进行对比。显示所有仍然打开的句柄。

    -disable

    (仅用户模式;仅Windows Server 2003和之后的系统) 禁止句柄跟踪。在Windows XP中,只有结束目标进程才能禁用句柄跟踪。

    -?

    在调试器命令窗口中显示一些简要的帮助文本。

    DLL

    Windows NT 4.0

    不可用

    Windows 2000

    不可用

    Windows XP 和之后

    Kdexts.dll 
    Ntsdexts.dll

    注释

    !htrace 能够使用之前,必须针对目标进程激活应用程序验证器(Application Verifier),并且必须选择 Detect invalid handle usage选项。通过激活应用程序验证器,进程每次打开句柄、关闭句柄或者饮用非法句柄时,都会保存堆栈回溯的信息。这就是!htrace 显示出来的那些堆栈回溯。详细信息,查看应用程序验证器

    下面的例子显示了进程0x81400300中所有句柄的信息:

    kd> !htrace 0 81400300
    Process 0x81400300
    ObjectTable 0xE10CCF60

    --------------------------------------
    Handle 0x7CC - CLOSE:
    0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
    0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
    0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
    0x801E1EDD: ntoskrnl!NtClose+0x19
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    --------------------------------------
    Handle 0x7CC - OPEN:
    0x8018F44A: ntoskrnl!ExCreateHandle+0x94
    0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
    0x801E7317: ntoskrnl!ObInsertObject+0xC3
    0x77DE23B2: KERNEL32!CreateSemaphoreA+0x66
    0x010011C5: badhandle!main+0x45
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    --------------------------------------
    Handle 0x7DC - BAD REFERENCE:
    0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
    0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
    0x801902BE: ntoskrnl!NtSetEvent+0x6C
    0x80154965: ntoskrnl!_KiSystemService+0xC4
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    --------------------------------------
    Handle 0x7DC - CLOSE:
    0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
    0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
    0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
    0x801E1EDD: ntoskrnl!NtClose+0x19
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
    --------------------------------------
    Handle 0x7DC - OPEN:
    0x8018F44A: ntoskrnl!ExCreateHandle+0x94
    0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
    0x801E7317: ntoskrnl!ObInsertObject+0xC3
    0x77DE265C: KERNEL32!CreateEventA+0x66
    0x010011A0: badhandle!main+0x20
    0x010012C1: badhandle!mainCRTStartup+0xE3
    0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

    --------------------------------------
    Parsed 0x6 stack traces.
    Dumped 0x5 stack traces.

    附加信息

    关于句柄的更多信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals 。要显示指定句柄的信息,查看!handle扩展命令。

    !imggp

    !imggp 扩展显示64位映像的全局指针目录中的条目(global pointer (GP) directory entry)的值。

    语法

    !imggp Address 

    参数

    Address

    指定映像的基地址。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP 和之后

    Ext.dll

    !imgreloc

    !imgreloc 扩展显示每个已加载模块的地址,以及重定位之前它们原本的地址。

    语法

    !imgreloc Address 

    参数

    Address

    指定映像的基地址。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP 和之后

    Ext.dll

    注释

    下面是一个示例:

    0:000> !imgreloc 00400000
    00400000 Prymes - at preferred address
    010e0000 appvcore - RELOCATED from 00400000
    5b2f0000 verifier - at preferred address
    5d160000 ShimEng - at preferred address

    !kuser

    !kuser 扩展显示共享的用户模式页面 (KUSER_SHARED_DATA)。

    语法

    !kuser 

    DLL

    Windows NT 4.0

    Kdextx86.dll 
    Ntsdexts.dll

    Windows 2000

    Kdextx86.dll 
    Ntsdexts.dll

    Windows XP 和之后

    Exts.dll

    注释

    KUSER_SHARED_DATA 页面包含当前登录用户的资源和其他信息。

    这里是一个示例。注意例中tick count 使用原始格式和圆括号中的更可读的格式显示了两次。这种可读格式仅在Windows XP和之后的系统中可用。

    kd> !kuser
    _KUSER_SHARED_DATA at 7ffe0000
    TickCount:    fa00000 * 00482006 (0:20:30:56.093)
    TimeZone Id: 2
    ImageNumber Range: [14c .. 14c]
    Crypto Exponent: 0
    SystemRoot: 'F:WINDOWS'

    !list

    !list 扩展为链表中每个成员都执行指定的调试器命令。

    语法

    !list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [OptionsStartAddress 
    !list " -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [OptionsStartAddress " 
    !list -h 

    参数

    Module

    用于指定定义该结构的模块的可选参数。如果Type 可能匹配另外的模块中的合法符号,则需要包含Module 来避免混淆。

    Type

    指定数据结构的名字。

    Field

    指定包含链表的字段。这实际上可以是以点号分隔的字段序列(即 Type.Field.Subfield.Subsubfield,等等)。

    -x "Commands"

    指定要执行的命令。可以是任何调试器命令的组合。必须用括号括起来。如果指定了多条命令,需要用分号来分隔它们,并且将整个!list 的参数集合用引号括起来,并且对引号中的其他引号使用转义字符(  )。如果省略Commands,默认命令是 dp (Display Memory)

    -a "Arguments"

    指定传递给Commands的参数。必须包含在引号中。Arguments除了不能包含银号之外,可以是允许跟在命令后的任意合法参数的字符串。如果Commands 中包含伪寄存器$extret,可以省略 -a "Arguments" 参数。

    Options

    可以是任意数量的下面这些选项:

    -e

    回显对每个成员执行的命令。

    -m Max

    指定要执行命令的成员的最大个数。

    StartAddress

    指定第一个数据结构的地址。这可以是结构的首地址,而不一定必须是链表字段的地址。

    -h

    在调试器命令窗口中显示该扩展命令的简单帮助文本。

    DLL

    Windows NT 4.0

    Ext.dll

    Windows 2000

    Ext.dll

    Windows XP 和之后

    Ext.dll

    注释

    !list 扩展将会遍历列表,并对每个成员执行指定命令。

    $extret 伪寄存器的值会设置成每个成员的链表入口(list-entry)的地址。对每个成员,都会执行命令字符串Commands 。该命令字符串可以使用@$extret 语法来引用这个伪寄存器。如果没有在命令字符串中使用它,在执行之前链表入扣的地址会被添加到末尾。如果想控制这个值出现在命令的什么位置,则必须显式指定该伪寄存器。

    命令序列会一直运行直到遇到以null指针标识的链表结束位置,或者指向第一个成员的位置。如果链表循环回了非第一个成员的位置,则命令不会 结束。但是,可以在KD和CDB中使用CTRL+C,或者 WinDbg中使用Debug | Break CTRL+BREAK 来停止。

    每次执行命令时,如果命令字符串使用了可选的地址参数,则当前结构的地址会作为默认地址 

    下面是在用户模式下使用该命令的两个例子。注意内核模式下也可以使用但是语法不同。

    首先是简单一点的例子,假设有一个名为MYTYPE 的结构,链表字段是.links.Flink .links.Blink。有一个从0x6BC000处的结构开始的链表。下面的命令会遍历该链表,并对每个成员执行一次dd L2 命令。由于dd 命令没有指定地址,所以会使用链表成员的地址。所以最后显示了每个结构的前两个DWORD。

    0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00 

    下面是更复杂一些的例子用来说明$extret 的使用。它会遍历RtlCriticalSectionList 的_LIST_ENTRY 类型的链表。对每个成员,显示开头的4个DWORD,然后显示以链表成员的Flink 字段之前8个字节开始的_RTL_CRITICAL_SECTION_DEBUG 结构。

    0:000> !list "-t ntdll!_LIST_ENTRY.Flink -e -x "dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8" ntdll!RtlCriticalSectionList"
    dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
    7c97c0c8  7c97c428 7c97c868 01010000 00000080
       +0x000 Type             : 1
       +0x002 CreatorBackTraceIndex : 0
       +0x004 CriticalSection  : (null)
       +0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c428 - 0x7c97c868 ]
       +0x010 EntryCount       : 0x1010000
       +0x014 ContentionCount  : 0x80
       +0x018 Spare            : [2] 0x7c97c100

    dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
    7c97c428  7c97c448 7c97c0c8 00000000 00000000
       +0x000 Type             : 0
       +0x002 CreatorBackTraceIndex : 0
       +0x004 CriticalSection  : 0x7c97c0a0
       +0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c448 - 0x7c97c0c8 ]
       +0x010 EntryCount       : 0
       +0x014 ContentionCount  : 0
       +0x018 Spare            : [2] 0

    !lmi

    !lmi 扩展显示某个模块的详细信息。

    语法

    !lmi Module 

    参数

    Module

    用名字或者基地址指定一个已加载的模块。

    DLL

    Windows NT 4.0

    Dbghelp.dll

    Windows 2000

    Dbghelp.dll

    Windows XP 和之后

    Dbghelp.dll

    注释

    可以使用lm (List Loaded Modules) 命令获得模块基地址。

    !lmi 扩展分析模块头,并格式化显示它包含的摘要信息。如果模块头被页换出了,则显示一条错误信息。要查看更多头信息,使用!dh 扩展命令。

    该命令会显示很多具有不同标题的字段。某些标题有特殊的意义:

    • Image Name字段显示可执行文件名,包括扩展名。一般来说,用户模式下会包含完整路径,而内核模式下不会。
    • Module 字段显示模块名。它通常是没有扩展名的文件名。但是有些情况下模块名和文件名会有显著的不同。详细信息,查看可执行映像路径
    • Symbol Type 字段显示调试器会尝试用来加载该模块的符号的信息。各种状态值得说明,查看符号状态缩写。如果符号已经加载,则后面会跟符号的文件名。
    • Base Address显示模块的首地址。Size显示模块大小。 因此,如果Base Address 是"faab4000" 并且Size 是"2000",则模块是在0xFAAB4000 到0xFAAB5FFF范围内。

    下面是一个例子:

    0:000> lm 
    start    end        module name
    00400000 0042d000   Prymes     C (pdb symbols)              Prymes.pdb
    77e80000 77f35000   KERNEL32     (export symbols)           C:WINNTsystem32KERNEL32.dll
    77f80000 77ffb000   ntdll        (export symbols)           ntdll.dll

    0:000> !lmi 00400000
    Loaded Module Info: [00400000] 
             Module: Prymes
       Base Address: 00400000
         Image Name: Prymes.exe
       Machine Type: 332 (I386)
         Time Stamp: 3c76c346 Fri Feb 22 14:16:38 2002
               Size: 2d000
           CheckSum: 0
    Characteristics: 230e stripped 
    Debug Data Dirs: Type Size     VA  Pointer
                     MISC  110,     0,   77a00 [Data not mapped]
        Symbol Type: EXPORT   - PDB not found
        Load Report: export symbols

    例子中的Characteristics 行显示的缩写的说明,查看符号状态缩写

    WinDbg 文档翻译----71

    cc682/NetRoc

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

    !handle

    !handle 扩展显示目标系统中一个或所有进程拥有的句柄的信息。

    语法

    用户模式

    !handle [Handle [UMFlags [TypeName]]] 
    !handle -? 

    内核模式

    !handle [Handle [KMFlags [Process [TypeName]]]] 

    参数

    Handle

    指定要显示的句柄序号。如果Handle是-1或者省略,调试器显示当前进程关联的所有句柄的数据。如果Handle 是0,调试器显示所有句柄的数据。

    UMFlags

    (仅用户模式) 指定显示中应该包括的内容。该参数可以是任意的下面这些位值的和(默认值为1。)

    Bit 0 (0x1)

    显示句柄类型信息。

    Bit 1 (0x2)

    显示基本的句柄信息。

    Bit 2 (0x4)

    显示句柄名信息。

    Bit 3 (0x8)

    如果可能的话,显示对象相关的句柄信息。

    KMFlags

    (仅内核模式) 指定显示中应该包含的内容。该参数可以是任意的下面这些位值的和。(默认值是0x3。)

    Bit 0 (0x1)

    显示基本句柄信息。

    Bit 1 (0x2)

    显示对象的信息。

    Bit 2 (0x4)

    显示free handle条目。如果不设置这一位或者Handle省略或为0,则显示出来的句柄列表不包括free handle。如果Handle指定了单个free handle,则即使没有设置这一位也会显示出来。

    Bit 4 (0x10)

    (Windows XP 和之后) 显示内核句柄表中的句柄而不是当前进程的。

    Bit 5 (0x20)

    (Windows XP 和之后) 将句柄当作线程ID或进程ID,并且显示相应的内核对象的信息。

    Process

    (仅内核模式) 指定一个进程。可以使用进程ID或者进程对象的16进制地址。该参数必须指定目标系统中正在运行的进程。如果设置为-1或者省略,则使用当前进程。

    TypeName

    指定要确认的句柄类型。只有匹配该类型的句柄才会显示出来。TypeName 是区分大小写的。合法的类型有Event、Section、File、Port、Directory、SymbolLink、Mutant、WindowStation、Semaphore、Key、Token、Process 、Thread、Desktop、IoCompletion、Timer、Job和WaitablePort。

    -?

    (仅用户模式) 调试器命令窗口中显示该扩展的帮助文本。

    DLL

    Windows NT 4.0

    Kdextx86.dll 
    Uext.dll 
    Ntsdexts.dll

    Windows 2000

    Kdextx86.dll 
    Uext.dll 
    Ntsdexts.dll

    Windows XP 和之后

    Kdexts.dll 
    Uext.dll 
    Ntsdexts.dll

     

    注释

    可以在用户模式和内核模式活动调试时使用!handle 扩展。也可以在内核模式dump文件上使用它。但如果创建时没包含句柄信息,则不能在调试用户模式dump文件时使用。(可以通过.dump /mh (Create Dump File)命令来创建这种dump文件。)

    用户模式活动调试时,可以使用.closehandle (Close Handle) 命令关闭一个或多个句柄。

    下面是用户模式下使用!handle 的示例。这条命令显示句柄列表。

    0:000> !handle
    Handle 4
      Type          Section
    Handle 8
      Type          Event
    Handle c
      Type          Event
    Handle 10
      Type          Event
    Handle 14
      Type          Directory
    Handle 5c
      Type          File
    6 Handles
    Type            Count
    Event           3
    Section         1
    File            1
    Directory       1

    下面的命令显示句柄0x8的详细信息。

    0:000> !handle 8 f
    Handle 8
      Type          Event
      Attributes    0
      GrantedAccess 0x100003:
             Synch
             QueryState,ModifyState
      HandleCount   2
      PointerCount  3
      Name          <none>
      Object Specific Information
        Event Type Auto Reset
        Event is Waiting

    下面是内核模式下使用!handle的示例。这条命令列举所有句柄,包括free handle。

    kd> !handle 0 4
    processor number 0
    PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
        DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
        Image: Idle

    New version of handle table at e1002000 with 380 Entries in use

    0000: free handle, Entry address e1002000, Next Entry fffffffe
    0004: Object: 80ed5238  GrantedAccess: 001f0fff
    0008: Object: 80ed46b8  GrantedAccess: 00000000
    000c: Object: e1281d00  GrantedAccess: 000f003f
    0010: Object: e1013658  GrantedAccess: 00000000
    ......
    0168: Object: ffb6c748  GrantedAccess: 00000003 (Protected)
    016c: Object: ff811f90  GrantedAccess: 0012008b
    0170: free handle, Entry address e10022e0, Next Entry 00000458
    0174: Object: 80dfd5c8  GrantedAccess: 001f01ff
    ......

    下面的命令显示内核句柄表中的0x14句柄的详细信息。

    kd> !handle 14 13
    processor number 0
    PROCESS 80559800  SessionId: 0  Cid: 0000    Peb: 00000000  ParentCid: 0000
        DirBase: 00039000  ObjectTable: e1000d60  TableSize: 380.
        Image: Idle

    Kernel New version of handle table at e1002000 with 380 Entries in use
    0014: Object: e12751d0  GrantedAccess: 0002001f
    Object: e12751d0  Type: (80ec8db8) Key
        ObjectHeader: e12751b8
            HandleCount: 1  PointerCount: 1
            Directory Object: 00000000  Name: REGISTRYMACHINESYSTEMCONTROLSET001CONTROLSESSION MANAGEREXECUTIVE

    附加信息

    关于句柄的更多信息,查看!htrace 扩展、Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

    !heap

    !heap 扩展显示堆使用信息,控制堆管理器中的断点,检测泄露的堆块,搜索堆块或者显示页堆(page heap)信息。

    语法

    Windows NT 4.0的语法

    !heap [HeapOptions] [ValidationOptions] [Heap
    !heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress
    !heap -B {alloc|realloc|free} [Heap | BreakAddress
    !heap -? 

    Windows 2000的语法

    !heap [HeapOptions] [ValidationOptions] [Heap
    !heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress
    !heap -B {alloc|realloc|free} [Heap | BreakAddress
    !heap -p PageHeapOptions 
    !heap [-p-? 

    Windows XP和之后的语法

    !heap [HeapOptions] [ValidationOptions] [Heap
    !heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress
    !heap -B {alloc|realloc|free} [Heap | BreakAddress
    !heap -l 
    !heap -s [SummaryOptions] [StatHeapAddress
    !heap -i HeapAddress
    !heap -x [-vAddress 
    !heap -p [PageHeapOptions
    !heap -srch [SizePattern
    !heap -flt FilterOptions
    !heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
    !heap [-p-? 

    参数

    Heap

    指定堆序号或者堆的地址。默认值为1,用于指定进程堆。如果指定0,则显示进程中所有堆的信息。省略Heap 则显示进程中堆的简明列表。

    HeapOptions

    可以使下面这些选项的任意组合。HeapOptions 值区分大小写。

    选项

    作用

    -v

    使得调试器验证指定的堆。

    -a

    显示中包含指定堆的所有信息。这种情况下,大小会被四舍五入到堆的分配粒度。(运行!heap –a 选项相当于使用-h -f –m这三个选项,会需要较长时间。)

    -h

    输出中包含指定堆的所有条目。

    -f

    输出中包含指定堆的所有空闲列表项(free list entries)。

    -m

    输出重包含指定堆的所有段条目(segment entries)。

    -t

    使得输出重包含指定堆的标签信息(tag information)。

    -T

    输出中包含指定堆的伪标签条目(pseudo-tag entries)。

    -g

    输出中包括全局标签信息(global tag information)。全局标签和每个无标签的分配(untagged allocation)关联。

    -s

    输出中包含指定堆的摘要信息。

    -k

    (仅x86目标) 输出重包含每个条目关联的堆栈回溯。

    -c

    (仅Windows NT 4.0) 输出中包含针对该堆的最近一次API调用。

     

    ValidationOptions

    可以是下面这些选项中的一个。ValidationOptions 区分大小写。

    选项

    作用

    -C

    (仅Windows NT 4.0) 对指定的堆进行API调用跟踪。使用该选项会交替的启用和禁用这种跟踪。初始的跟踪状态由传递给RtlCreateHeap 的标志是否包含HEAP_Create_ENABLE_TRACING 决定。该状态也可以通过全局标志来改变。

    -D

    禁止指定堆的调用时验证(validate-on-call)。

    -E

    启用指定堆的调用时验证(validate-on-call)。

    -d

    禁用指定堆的堆检查(heap checking)。

    -e

    启用指定堆的堆检查(heap checking)。

     

    BreakAddress

    指定要设置或删除断点的块的地址。

    -b

    使得调试器在堆管理器中设置条件断点。-b 后可跟allocrealloc或者 free,用于指定断点是否在分配、重新分配或者释放内存时激活。如果BreakAddress 用来指定块的地址,可以省略断点类型。如果Heap用来指定堆地址或者堆序号,则必须包含类型和Tag参数。

    Tag

    指定堆中的标签名。

    -B

    使得调试器在堆管理器中移除一个条件断点。必须指定断点类型(alloc realloc free),并且必须和-b 选项使用的一样。

    -l

    (Windows XP和之后) 使得调试器检查泄露的堆块。

    -s

    (Windows XP和之后) 指定需要摘要信息。如果省略SummaryOptions StatHeapAddress,则当前进程关联的所有堆的摘要信息都会显示出来。

    SummaryOptions

    (Windows XP 和之后) 可以是任意下面这些选项。SummaryOptions 不区分大小写。

    选项

    作用

    -v

    验证所有数据块。

    -b BucketSize

    指定存储单元(bucket)的大小。默认值为1024 bit。

    -d DumpBlockSize

    指定存储单元大小。

    -a

     

    -c

    指示每个块得内容都应该显示出来。

     

    StatHeapAddress

    (Windows XP和之后) 指定堆的地址。如果为0或者省略,则显示当前进程关联的所有堆。

    -i Heap

    (Windows XP 和之后) 显示指定的Heap 的信息。

    -x [-v]

    (Windows XP 和之后) 使得调试器搜索包含指定地址的堆块。如果添加了-v ,命令会在当前进程的整个虚拟内存空间中搜索指向该堆块的指针。

    Address

    (Windows XP 和之后) 指定要搜索的地址。

    -p

    (Windows 2000 和之后) 指示需要页堆(page heap)信息。如果没有和任何PageHeapOptions 一起使用,则所有页堆都会显示出来。

    PageHeapOptions

    可以是下面这些选项中的单个。PageHeapOptions 区分大小写。如果不指定选项,所有可能的页堆句柄都会显示出来。

    选项

    作用

    -h Handle

    使得调试器显示句柄为Handle的页堆的详细信息。

    -a Address

    使得调试器查找块中包含Address的页堆。会包含该地址和完整的页堆块的关系的详细信息,如是否该地址是页堆的一部分、它在块中的偏移,以及这个块已经被分配还是空闲的。在可能时还会包含堆栈回溯。使用该选项时,显示的大小是堆分配粒度的倍数。

    -t[c|s] [Traces]

    使得调试器显示大量使用堆的用户(heavy heap users)的纪录(collected traces)。Traces指定要显示的纪录数量,默认值为4。如果有比指定的数量更多的纪录,则显示前面的部分纪录。如果使用-t 或者-tc ,则纪录以使用记数(count usage)排序。如果使用-ts ,则纪录以大小排序。 (-tc -ts 选项仅在Windows XP中支持,-t选项在Windows XP和之前的版本中都支持。)

    -fi [Traces]

    (Windows XP 和之后) 使得调试器显示最近的故障注入纪录(fault injection traces)。 Traces 指定要显示的熟练,默认值为4。

    -all

    (Windows XP和之后) 使得调试器显示所有页堆的详细信息。

    -?

    使得调试器显示页堆帮助(page heap help),包括堆块的图表。(这些图表在下面的注释节中可以看到。)

     

    使用任何!heap -p 扩展命令之前,目标进程中必须已经启用了页堆。查看后面注释节中的详细说明。

    -srch

    (Windows XP 和之后) 在所有堆中进行查找。

    Pattern

    (Windows XP 和之后) 要查找的内容。

    Size

    (Windows XP 和之后) 可以是下面选项中的任意一个。用于指定pattern 的大小。必须使用'-'。

    选项

    作用

    -b

    pattern的大小是一个BYTE。

    -w

    pattern的大小是一个WORD。

    -d

    pattern的大小是一个DWORD。

    -q

    pattern的大小是一个QWORD。

     

    如果不指定上面任何一个,则会假定pattern 的大小和机器的指针大小一致。

    -flt

    (Windows XP和之后) 将显示出来的堆限制为指定大小或大小范围的。

    FilterOptions

    (Windows XP 和之后) 可以是下面选项之一。FilterOptions 区分大小写。

    选项

    作用

    s Size

    限制显示出来的堆必须是指定的大小。

    r SizeMin SizeMax

    限制显示出来的堆大小在指定范围内。

     

    -stat

    (Windows XP和之后) 显示指定的堆的使用统计。

    -h Handle

    (Windows XP 和之后) 只有句柄为Handle的堆的使用统计会显示出来。如果Handle为0或者省略,则所有堆的使用统计都会显示。

    -grp GroupBy

    (Windows XP 和之后) 按照GroupBy 的指定重新排序显示。GroupBy 选项可以是下表中的值。

    选项

    作用

    A

    根据分配大小显示使用统计。

    B

    根据块数量显示使用统计。

    S

    根据每次分配的总大小显示使用统计。

     

    MaxDisplay

    (Windows XP和之后) 限制输出最多为MaxDisplay 行。

    -?

    在调试器命令窗口中显示该命令的简要帮助文本。使用!heap -? 查看常规帮助,!heap -p -? 查看页堆帮助。 (页堆帮助只在Windows 2000和之后的系统中可用。)

    DLL

    Windows NT 4.0

    Ext.dll 
    Kdextx86.dll 
    Ntsdexts.dll

    Windows 2000

    Ext.dll 
    Kdextx86.dll 
    Ntsdexts.dll

    Windows XP 和之后

    Ext.dll 
    Exts.dll

     

    注释

    该扩展命令可以用来实现几种任务。

    标准的!heap 命令用来显示当前进程的堆信息。(仅针对用户模式进程。!pool 扩展命令用于系统进程。)

    !heap -b !heap -B 命令用于在堆管理器中创建或者删除条件断点。

    !heap -l 命令检查泄露的堆块。它使用一种垃圾回收算法(garbage collector algorithm)来检测没有被进程地址空间中任何地方引用到的已占用块(busy blocks)。对很大的程序,可能需要花费数分钟才能完成。该命令只在Windows XP和之后版本中可以使用。

    !heap -x 命令搜索包含给定地址的堆块。如果使用了-v 选项,该命令还会搜索当前进程的整个虚拟地址空间,以获得指向该堆块的指针。这个命令仅在Windows XP和之后版本中可以使用。

    !heap -p 命令显示各种形式的页堆(page heap)信息。仅在Windows 2000(Service Pack 1或之后)、Windows XP、以及之后版本的Windows中可用。如果在调试Windows NT 4.0,则需要使用!dphdump !dphfind!dphflags!dphhogs来替代。

    使用!heap –p之前,必须启用目标进程的页堆(page heap)。这可以通过全局标志 (gflags.exe) 实用工具实现。打开该工具,在Image File Name 文本框中填入目标进程的名字,选择Image File Options 以及Enable page heap ,然后点击Apply 。也可以从命令提示符窗口输入gflags /i xxx.exe +hpa 来运行全局标志工具,xxx.exe 是目标程序的名字。

    注意在NT 4.0中,只有在调试器已经附加或者进程启动时全局标志已经进行过了适当的设置时,页堆命令才能正确工作。

    !heap -p -t[c|s] 命令在Windows XP之后就不支持了。可以使用调试器工具包中的UMDH工具来获得类似的结果。

    !heap -srch 命令显示包含指定模板的堆条目(heap entries)。该命令仅在Windows XP和之后版本中可以使用。

    !heap -flt 命令限制只显示分配大小为指定值的堆。该命令仅在Windows XP和之后版本中可用。

    !heap -stat 命令显示堆使用统计。该命令仅在Windows XP和之后版本可用。

    这里是一个标准的!heap 命令的示例:

    0:000> !ntsdexts.heap -a
    Index   Address  Name      Debugging options enabled
      1:   00250000 
        Segment at 00250000 to 00350000 (00056000 bytes committed)
        Flags:               50000062
        ForceFlags:          40000060
        Granularity:         8 bytes
        Segment Reserve:     00100000
        Segment Commit:      00004000
        DeCommit Block Thres:00000400
        DeCommit Total Thres:00002000
        Total Free Size:     000003be
        Max. Allocation Size:7ffddfff
        Lock Variable at:    00250b54
        Next TagIndex:       0012
        Maximum TagIndex:    07ff
        Tag Entries:         00350000
        PsuedoTag Entries:   00250548
        Virtual Alloc List:  00250050
        UCR FreeList:        002504d8
        128-bit bitmap of free lists
        FreeList Usage:      00000014 00000000 00000000 00000000
                  Free    Free
                  List    List
                  #       Head      Blink      Flink
        FreeList[ 00 ] at 002500b8: 002a4378 . 002a4378
                                    0x02 - HEAP_ENTRY_EXTRA_PRESENT
                                    0x04 - HEAP_ENTRY_FILL_PATTERN
            Entry     Prev    Cur   0x10 - HEAP_ENTRY_LAST_ENTRY

    Address   Size    Size  flags
    002a4370: 00098 . 01c90 [14] - free
        FreeList[ 02 ] at 002500c8: 0025cb30 . 002527b8
    002527b0: 00058 . 00010 [04] - free
    0025cb28: 00088 . 00010 [04] - free
        FreeList[ 04 ] at 002500d8: 00269a08 . 0026e530
    0026e528: 00038 . 00020 [04] - free
    0026a4d0: 00038 . 00020 [06] - free
    0026f9b8: 00038 . 00020 [04] - free
    0025cda0: 00030 . 00020 [06] - free
    00272660: 00038 . 00020 [04] - free
    0026ab60: 00038 . 00020 [06] - free
    00269f20: 00038 . 00020 [06] - free
    00299818: 00038 . 00020 [04] - free
    0026c028: 00038 . 00020 [06] - free
    00269a00: 00038 . 00020 [46] - free
        
        Segment00 at 00250b90:
    Flags:           00000000
    Base:            00250000
    First Entry:     00250bc8
    Last Entry:      00350000
    Total Pages:     00000080
    Total UnCommit:  00000055
    Largest UnCommit:000aa000
    UnCommitted Ranges: (1)
        002a6000: 000aa000

        Heap entries for Segment00 in Heap 250000
                            0x01 - HEAP_ENTRY_BUSY            
                            0x02 - HEAP_ENTRY_EXTRA_PRESENT   
                            0x04 - HEAP_ENTRY_FILL_PATTERN    
                            0x08 - HEAP_ENTRY_VIRTUAL_ALLOC   
                            0x10 - HEAP_ENTRY_LAST_ENTRY      
                            0x20 - HEAP_ENTRY_SETTABLE_FLAG1  
                            0x40 - HEAP_ENTRY_SETTABLE_FLAG2  
    Entry     Prev    Cur   0x80 - HEAP_ENTRY_SETTABLE_FLAG3  

    Address   Size    Size  flags       (Bytes used)    (Tag name)
    00250000: 00000 . 00b90 [01] - busy (b90)
    00250b90: 00b90 . 00038 [01] - busy (38) 
    00250bc8: 00038 . 00040 [07] - busy (24), tail fill (NTDLL!LDR Database)
    00250c08: 00040 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
    00250c68: 00060 . 00028 [07] - busy (10), tail fill (NTDLL!LDR Database)
    00250c90: 00028 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
    00250cf0: 00060 . 00050 [07] - busy (38), tail fill (Objects=  80)
    00250d40: 00050 . 00048 [07] - busy (2e), tail fill (NTDLL!LDR Database)
    00250d88: 00048 . 00c10 [07] - busy (bf4), tail fill (Objects>1024)
    00251998: 00c10 . 00030 [07] - busy (12), tail fill (NTDLL!LDR Database)
    ...
    002525c0: 00030 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
    00252620: 00060 . 00050 [07] - busy (38), tail fill (NTDLL!LDR Database)
    00252670: 00050 . 00040 [07] - busy (22), tail fill (NTDLL!CSRSS Client)
    002526b0: 00040 . 00040 [07] - busy (24), tail fill (Objects=  64)
    002526f0: 00040 . 00040 [07] - busy (24), tail fill (Objects=  64)
    00252730: 00040 . 00028 [07] - busy (10), tail fill (Objects=  40)
    00252758: 00028 . 00058 [07] - busy (3c), tail fill (Objects=  88)
    002527b0: 00058 . 00010 [04] free fill
    002527c0: 00010 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
    00252818: 00058 . 002d0 [07] - busy (2b8), tail fill (Objects= 720)
    00252ae8: 002d0 . 00330 [07] - busy (314), tail fill (Objects= 816)
    00252e18: 00330 . 00330 [07] - busy (314), tail fill (Objects= 816)
    00253148: 00330 . 002a8 [07] - busy (28c), tail fill (NTDLL!LocalAtom)
    002533f0: 002a8 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
    00253420: 00030 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
    00253450: 00030 . 00098 [07] - busy (7c), tail fill (BASEDLL!LMEM)
    002534e8: 00098 . 00060 [07] - busy (44), tail fill (BASEDLL!TMP)
    00253548: 00060 . 00020 [07] - busy (1), tail fill (Objects=  32)
    00253568: 00020 . 00028 [07] - busy (10), tail fill (Objects=  40)
    00253590: 00028 . 00030 [07] - busy (16), tail fill (Objects=  48)
    ...
    0025ccb8: 00038 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
    0025cd18: 00060 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
    0025cd70: 00058 . 00030 [07] - busy (18), tail fill (NTDLL!LDR Database)
    0025cda0: 00030 . 00020 [06] free fill (NTDLL!Temporary)
    0025cdc0: 00020 . 00258 [07] - busy (23c), tail fill (Objects= 600)
    0025d018: 00258 . 01018 [07] - busy (1000), tail fill (Objects>1024)
    0025e030: 01018 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
    ...
    002a4190: 00028 . 00118 [07] - busy (100), tail fill (BASEDLL!GMEM)
    002a42a8: 00118 . 00030 [07] - busy (18), tail fill (Objects=  48)
    002a42d8: 00030 . 00098 [07] - busy (7c), tail fill (Objects= 152)
    002a4370: 00098 . 01c90 [14] free fill
    002a6000:      000aa000      - uncommitted bytes.

    这是!heap -l 命令的示例:

    1:0:011> !heap -l
    1:Heap 00170000
    Heap 00280000
    Heap 00520000
    Heap 00b50000
    Heap 00c60000
    Heap 01420000
    Heap 01550000
    Heap 016d0000
    Heap 019b0000
    Heap 01b40000
    Scanning VM ...
    Entry     User      Heap      Segment       Size  PrevSize  Flags
    ----------------------------------------------------------------------
    001b2958  001b2960  00170000  00000000        40        18  busy extra
    001b9cb0  001b9cb8  00170000  00000000        80       300  busy extra
    001ba208  001ba210  00170000  00000000        80        78  busy extra
    001cbc90  001cbc98  00170000  00000000        e0        48  busy extra
    001cbd70  001cbd78  00170000  00000000        d8        e0  busy extra
    001cbe90  001cbe98  00170000  00000000        68        48  busy extra
    001cbef8  001cbf00  00170000  00000000        58        68  busy extra
    001cc078  001cc080  00170000  00000000        f8       128  busy extra
    001cc360  001cc368  00170000  00000000        80        50  busy extra
    001cc3e0  001cc3e8  00170000  00000000        58        80  busy extra
    001fe550  001fe558  00170000  00000000       150       278  busy extra
    001fe6e8  001fe6f0  00170000  00000000        48        48  busy extra
    002057a8  002057b0  00170000  00000000        58        58  busy extra
    00205800  00205808  00170000  00000000        48        58  busy extra
    002058b8  002058c0  00170000  00000000        58        70  busy extra
    00205910  00205918  00170000  00000000        48        58  busy extra
    00205958  00205960  00170000  00000000        90        48  busy extra
    00246970  00246978  00170000  00000000        60        88  busy extra
    00251168  00251170  00170000  00000000        78        d0  busy extra user_flag
    00527730  00527738  00520000  00000000        40        40  busy extra
    00527920  00527928  00520000  00000000        40        80  busy extra
    21 leaks detected.

    例子中找到了21处泄露。

    这是一个!heap -x 命令的示例:

    0:011> !heap 002057b8 -x
    Entry     User      Heap      Segment       Size  PrevSize  Flags
    ----------------------------------------------------------------------
    002057a8  002057b0  00170000  00170640        58        58  busy extra

    这是!heap -x -v 命令的示例:

    1:0:011> !heap 002057b8 -x -v
    1:Entry     User      Heap      Segment       Size  PrevSize  Flags
    ----------------------------------------------------------------------
    002057a8  002057b0  00170000  00170640        58        58  busy extra

    Search VM for address range 002057a8 - 002057ff : 00205990 (002057d0),

    该例子中,地址0x00205990处有一个指向该堆块的指针。

    这是!heap -flt s 命令的示例:

    0:001>!heap -flt s 0x50

    会显示所有大小为0x50的堆分配。

    这是!heap -flt r 命令的示例:

    0:001>!heap -flt r 0x50 0x80

    这会显示大小在0x50 和0x7F 之间的堆分配。

    下面是!heap -srch 命令的示例:

    0:001> !heap -srch 77176934
        _HEAP @ 00090000
       in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
            00099A48: 0018 : 0005 [01] - 00099A50 (000000B8) - (busy)
              ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'
        _HEAP @ 00090000
       in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
            00099B58: 0018 : 0005 [01] - 00099B60 (000000B8) - (busy)
              ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'

    下面的图表是堆块的格式。这是Windows 2000(Service Pack 1和之后)、Windows XP、以及之后的系统中的形式。

    Light page heap 块 — 已分配:

     +-----+---------------+---+                                  
     |     |               |   |                                  
     +-----+---------------+---+                                  
        ^         ^          ^                                    
        |         |          8 
    字节后缀 ( 0xA0 填充)    
        |         
    用户分配(User allocation) (如果没有要求清0,则填充为 E0 ) 
        
    块首 ( 0xABCDAAAA 开头, 0xDCBAAAAA 结尾

    Light page heap 块  已释放:

     +-----+---------------+---+                                  
     |     |               |   |                                  
     +-----+---------------+---+                                  
        ^         ^          ^                                    
        |         |          8 
    字节后缀 ( 0xA0 填充)    
        |         
    用户分配 (如果没有要求清0,则填充为 E0)          
        
    块首 ( 0xABCDAAA9 开头, 0xDCBAAA9 结尾

    Full page heap 块 — 已分配:

     +-----+---------+---+-------                                 
     |     |         |   |  ... N/A page                          
     +-----+---------+---+-------                                 
        ^       ^      ^                                          
        |       |      0-7 
    字节后缀 ( 0xD0 填充)        
        |       
    用户分配 (如果未要求清0Windows 2000中填充为 E0 ,   
                Windows XP 
    中填充为 C0 )       
        
    块首 ( 0xABCDBBBB 开头,0xDCBABBBB 结尾

    Full page heap 块 —已释放:

     +-----+---------+---+-------                                 
     |     |         |   |  ... N/A page                          
     +-----+---------+---+-------                                 
        ^       ^      ^                                          
        |       |      0-7 
    字节后缀 ( 0xD0 填充)        
        |       
    用户分配 ( F0 填充)            
        
    块首 ( 0xABCDBBA 开头,0xDCBABBBA 结尾

    要查看Windows 2000下对堆块或者full page heap 块的分配和释放的堆栈回溯,可以对头地址使用dds (Display Words and Symbols) 命令。

    要查看Windows XP和之后的Windows下对堆块或者full page heap 块的分配和释放的堆栈回溯,对头地址实用 dt DPH_BLOCK_INFORMATION ,然后对StackTrace字段使用 dds 

    Windows 2000的Full page heap 块位于包含用户分配内存的页面的开头或者前一个页面的开头。

    附加信息

    关于堆的更多信息,查看Microsoft Windows SDK 文档、Windows Driver Kit (WDK)文档、以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internal



  • 相关阅读:
    链表
    java之Continue解析
    java之break解析
    数据库(Mysql)之count(column),count(1),count(*)用法
    数据结构(java语言描述)串与数组——稀疏矩阵的三元组表存储
    数据结构(java语言描述)串与数组——文件加解密
    数据结构(java语言描述)——串数组(n阶魔方)
    数据结构(java语言描述)模式匹配——KMP算法
    数据结构(java语言描述)模式匹配——Brute-Force(BF)算法
    java常见的软件包
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/3822262.html
Copyright © 2020-2023  润新知