NetRoc's Blog

N-Tech

 

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!Path\winext\uext.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 | BreakCTRL+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:\WINNT\system32\KERNEL32.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 行显示的缩写的说明,查看符号状态缩写

posted on 2008-07-15 16:24 NetRoc 阅读(570) 评论(0)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜