NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----75

cc682/NetRoc

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

内核模式扩展

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

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

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

  • 如果目标机运行在x86处理器的Windows NT 4.0 发行版上,则使用的是nt4fre\Kdextx86.dll
  • 如果目标机运行在x86处理器平台的Windows NT 4.0 调试版上,使用的是nt4chk\Kdextx86.dll
  • 如果目标机运行在Windows 2000的发行版上,则使用w2kfre\Kdextx86.dll
  • 如果目标机运行于Windows 2000调试版,则使用w2kchk\Kdextx86.dll
  • 如果目标机运行于Windows XP和之后的版本上,则使用winxp\Kdexts.dll

另外,winext\kext.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 (HTREE\ROOT\0)
  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 \Driver\PnpManager DriverObject 80e20610
Current Irp 00000000 RefCount 1 Type 00000004 Flags 00001040
DevExt 80e52830 DevObjExt 80e52838 DevNode 80e52628 
ExtensionFlags (0000000000)  
AttachedDevice (Upper) 80d78b28 \Driver\i8042prt
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

posted on 2008-07-17 12:07 NetRoc 阅读(492) 评论(1)  编辑 收藏 引用

评论

# re: WinDbg 文档翻译----75 2008-07-19 10:31 金碧酒店

哦呵  回复  更多评论   

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜