NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----50

cc682/NetRoc

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

c (Compare Memory)

c 命令比较两个内存区域中保存的值。

语法

c Range Address 

参数

Range

要比较的两个内存区域的第一个。该语法的更多信息,查看地址和地址区域语法

Address

要比较的第二个内存区域的起始地址。它的大小和指定的第一个内存区域一样。该语法的更多信息,查看地址和地址区域语法

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

如果两个区域不相同,调试器会显示第一个内存区域中不同的所有地址。

假设有下面的代码:

void main()
{
    char rgBuf1[100];
    char rgBuf2[100];

    memset(rgBuf1, 0xCC, sizeof(rgBuf1));
    memset(rgBuf2, 0xCC, sizeof(rgBuf2));

    rgBuf1[42] = 0xFF;
}

可以使用下面的命令之一来比较rgBuf1rgBuf2

0:000> c rgBuf1 (rgBuf1+100) rgBuf2

0:000> c rgBuf1 L 100 rgBuf2

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd (Display Memory)

d*命令显示给定范围内存的内容。

语法

d{a|b|c|d|D|f|p|q|u|w|W} [Options] [Range
dy{b|d} [Options] [Range
d [Options] [Range

参数

Options

指定一个或多个显示选项。除了不能包含一个以上/p*选项之外,可以包含任何下面的这些选项:

/c Width

指定要显示的列的数量。如果省略掉,默认的列数由显示类型决定。

/p

(仅内核模式) 使用物理内存地址进行显示。Range 指定的范围将被当作物理地址而不是虚拟内存。

/p[c]

(仅内核模式) 除了读取高速缓冲存储器(cached memory)中的内存之外,和/p一样。必须包含c两边的中括号。

/p[uc]

(仅内核模式) 除了读取非缓存的内存(uncached memory)之外和/p一样。必须包含uc两边的中括号。

/p[wc]

(仅内核模式) 除了会读取写聚合内存(write-combined memory)之外,和/p一样。必须包含wc两边的中括号。

Range

指定要显示的内存区域。语法的详细信息,查看地址和地址区域语法。如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。如果Range 省略掉并且之前没有执行过内存显示命令,则从当前指令指针位置开始显示。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

显示的每一行都会包含该行第一个字节的地址,后面跟该地址和之后的内存内容。

如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。这使得可以连续的进行内存查看。

该命令有以下这些形式。DddDdwdW命令的第二个字母和dybdyd的第三个字母是大小写敏感的。

命令

显示

d

这种显示的格式和最近一次d*命令的格式相同。如果之前没有使用过d*命令,ddb 的效果相同。

注意d重复前一个以d开头的命令。包括ddaddpddudpadppdpudqadqpdquddsdpsdqsdsdSdgdldtdv,以及本页中的显示命令。如果在d之后的参数不适当,可能会产生错误。

da

ASCII 字符。

每行最多48个字符。显示一直继续直到遇到第一个null字节或者到达range 值指定的所有字符都已经显示。所有不可打印字符,如回车和换行都被显示为点号(.)。

db

字节值和ASCII字符。

每个显示行都包含该行第一个字节的地址,后面跟16进制字节值。这些字节值后面会紧跟它们对应的ASCII值。第8和第9个16进制值之间会用连字号(-)分隔。所有不可打印字符,如回车和换行都被显示为点号(.)。

默认的显示个数为128字节。

dc

双字值(4字节)和ASCII字符。

每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值以及它们对应的ASCII字符。

默认的显示数量为32个DWORD(128字节)。

dd

双字值(4字节)
默认的显示数量为32个DWORD(128字节)。

dD

双精度浮点数(8字节)

默认的显示数量是15个数字(120字节)。

df

单精度浮点数(4字节)

默认的显示数量是16个数字(64字节)。

dp

指针大小的值。该命令根据目标机的处理器是32位还是64位的,分别等于dddq

默认显示数量为32个DWORD或者16个四字(quad-word) (128 字节)。

dq

四字值(Quad-word values) (8 bytes)。

默认显示数量为16个四字 (128 字节)。

du

Unicode字符 。

每行最多显示48个字符。显示一直继续直到遇到第一个null字节或者到达range 值指定的所有字符都已经显示。所有不可打印字符,如回车和换行都被显示为点号(.)。

dw

WORD值(2字节)。

每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值。

默认显示数量为64个WORD(128字节)。

dW

WORD值(2字节)和ASCII字符。

每个显示行都会显示行中第一个数据的地址,并且每行最多显示8个16进制值。

默认显示数量为64个WORD(128字节)。

dyb

二进制值和字节的值。

默认显示数量为32字节。

dyd

二进制值和双字值(4字节)。

默认显示数量为8个DWORD(32字节)。

 

如果尝试显示一个非法地址,它的内容会显示为问号(?)。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

dda, ddp, ddu, dpa, dpp, dpu, dqa, dqp, dqu (Display Referenced Memory)

ddaddpddudpadppdpudqadqpdqu 命令显示指定位置的指针、间接引用该指针并按照一定格式显示目标位置的内存。

语法

ddp [Options] [Range
dqp [Options] [Range
dpp [Options] [Range
dda [Options] [Range
dqa [Options] [Range
dpa [Options] [Range
ddu [Options] [Range
dqu [Options] [Range
dpu [Options] [Range

参数

Options

指定一个或多个显示选项。除了不能包含一个以上/p*选项之外,可以包含任何下面的这些选项:

/c Width

指定要显示的列的数量。如果省略掉,默认的列数由显示类型决定。由于这些命令显示指针的方法,一般情况下最好使用只有一个数据列的默认值。

/p

(仅内核模式) 使用物理内存地址进行显示。Range 指定的范围将被当作物理地址而不是虚拟内存。

/p[c]

(仅内核模式) 除了读取高速缓冲存储器(cached memory)中的内存之外,和/p一样。必须包含c两边的中括号。

/p[uc]

(仅内核模式) 除了读取非缓存的内存(uncached memory)之外和/p一样。必须包含uc两边的中括号。

/p[wc]

(仅内核模式) 除了会读取写聚合内存(write-combined memory)之外,和/p一样。必须包含wc两边的中括号。

Range

指定要显示的内存区域。语法的详细信息,查看地址和地址区域语法。如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。如果Range 省略掉并且之前没有执行过内存显示命令,则从当前指令指针位置开始显示。如果只是简单的给定一个地址,默认的范围长度为128字节。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

命令的第二和第三个字母是区分大小写的。

命令的第二个字母决定了所使用的指针大小:

命令

显示

dd*

使用32位指针

dq*

使用64位指针

dp*

使用标准的指针大小:由目标处理器架构决定是32位还是64位。

 

命令的第三个字符决定使用该指针间接引用的内存如何显示:

命令

显示

d*p

根据处理器架构决定的指针大小,以DWORD或QWORD的格式显示指针引用的内存。如果指针值和某个已知符号匹配,则符号也会被显示出来。

d*a

以ASCII字符形式显示指针引用的内存。

d*u

以Unicode字符形式显示指针引用的内存。

 

如果启用了行号信息,源码文件名和行号也会在可用时显示出来。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

dds, dps, dqs (Display Words and Symbols)

ddsdpsdqs命令显示给定范围内存的内容。该内存被假定为符号表中的一连串地址。相应的符号也会被显示出来。

语法

dds [Options] [Range
dqs [Options] [Range
dps [Options] [Range

参数

Options

指定一个或多个显示选项。除了不能包含一个以上/p*选项之外,可以包含任何下面的这些选项:

/c Width

指定要显示的列的数量。如果省略掉,默认的列数由显示类型决定。由于这些命令显示符号的方法,一般情况下最好使用只有一个数据列的默认值。

/p

(仅内核模式) 使用物理内存地址进行显示。Range 指定的范围将被当作物理地址而不是虚拟内存。

/p[c]

(仅内核模式) 除了读取高速缓冲存储器(cached memory)中的内存之外,和/p一样。必须包含c两边的中括号。

/p[uc]

(仅内核模式) 除了读取非缓存的内存(uncached memory)之外和/p一样。必须包含uc两边的中括号。

/p[wc]

(仅内核模式) 除了会读取写聚合内存(write-combined memory)之外,和/p一样。必须包含wc两边的中括号。

Range

指定要显示的内存区域。语法的详细信息,查看地址和地址区域语法。如果省略掉Range ,命令将会从上一条内存查看命令结束的位置开始。如果Range 省略掉并且之前没有执行过内存显示命令,则从当前指令指针位置开始显示。如果只是简单的给定一个地址,默认的范围长度为128字节。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

dds 的第二个字母是区分大小写的。这些命令的第三个字母都区分大小写。

dds 命令类似dd命令一样显示DWORD(4字节)的值。dqs 命令类似dq 一样显示QWORD(8字节)的值。dps命令类似dp一样显示大小为一个 指针的值(根据目标计算机架构,可能是4字节或8字节)。

这些字都被当作符号表中的地址。每个字相应的符号信息会被显示出来。

如果启用了行号信息,源码文件名和行号也会在可用时显示出来。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

dg (Display Selector)

dg命令显示指定的选择子(selector)的段描述符(segment descriptor)。

语法

dg FirstSelector [LastSelector

参数

FirstSelector

指定要显示的第一个选择子的16进制选择子值。

LastSelector

指定要显示的最后一个选择子。如果省略掉,则只显示一个选择子。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

x86、Itanium

 

注释

该命令不能显示多于256个的选择子。

公共的选择子值有:

Id

10进制

16进制

KGDT_NULL

0

0x00

KGDT_R0_CODE

8

0x08

KGDT_R0_DATA

16

0x10

KGDT_R3_CODE

24

0x18

KGDT_R3_DATA

32

0x20

KGDT_TSS

40

0x28

KGDT_R0_PCR

48

0x30

KGDT_R3_TEB

56

0x38

KGDT_VDM_TILE

64

0x40

KGDT_LDT

72

0x48

KGDT_DF_TSS

80

0x50

KGDT_NMI_TSS

88

0x58

 

dl (Display Linked List)

dl命令显示一个LIST_ENTRY或SINGLE_LIST_ENTRY链表。

语法

dl[bAddress MaxCount Size 

参数

b

如果包含,则链表被反向转储出来。(换句话说,调试器将沿着Blink来遍历,而不是Flink。)不能用于 SINGLE_LIST_ENTRY。

Address

链表的开始地址。该语法的详细信息,查看地址和地址区域语法

MaxCount

要转储的最大成员数量。

Size

每个成员的大小。这是要为链表中每个成员显示的连续的ULONG_PTR 个数。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

列表必须是LIST_ENTRY 或SINGLE_LIST_ENTRY 结构。如果它被包含在一个更大的结构中,要确定address指向链表结构而不是外部结构的起始位置。

显示从Address 开始。然而, 如果提供的是指向列表的头指针的地址,则需要忽略输出的第一项。

AddressMaxCounSize 参数都基于当前的默认基数。可以使用n (Set Number Base) 命令或0x 前缀来改变基数。

如果循环回了自身,则结束转储。如果遇到null指针,也会结束转储。

如果要对链表的每个成员执行一些命令,可以使用!list扩展命令。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

ds, dS (Display String)

dsdS命令显示一个STRING、ANSI_STRING或UNICODE_STRING结构。(这些命令不是用来显示null结尾的字符串。)

语法

d{s|S} [/c Width] [Address

参数

s

指定要显示的是STRING 或ANSI_STRING结构。(s区分大小写。)

S

指定要显示的是UNICODE_STRING结构。(S区分大小写。)

/c Width

指定每行中要显示的字符数量。这个数量包含不会显示出来的null字符。

Address

字符串开始的内存地址。语法的详细信息,查看地址和地址区域语法。如果省略掉,则使用上一个显示命令使用的地址。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

如果要在WinDbg的Locals窗口或Watch窗口显示Unicode字符串,需要首先使用.enable_unicode (Enable Unicode Display)命令。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

dt (Display Type)

dt命令显示局部变量、全局变量或数据类型的信息。它也可以仅显示数据类型。即结构和联合(union)的信息。

语法

用户模式语法

dt [-DisplayOpts] [-SearchOpts] [module!]NAME [[-SearchOptsField] [Address] [-l List
dt [-DisplayOptsAddress [-l List
dt -h 

内核模式语法

[Processordt [-DisplayOpts] [-SearchOpts] [module!]NAME [[-SearchOptsField] [Address] [-l List
dt [-DisplayOptsAddress [-l List
dt -h 

参数

Processor

指定运行包含需要的信息的进程的处理器。更多信息,查看多处理器语法。处理器只能在内核模式时指定。

DisplayOpts

指定下表中给定的一个或多个选项。这些选项以连字符开头。

选项

说明

-a[quantity]

在新行中显示每个数组成员和它的序号。共显示quantity 个成员。在aquantity 间不能加入空格。如果-a后面没有跟数字,则数组中的所有成员都会显示出来。-a[quantity]开关必须紧跟在每个希望按这种方式显示的类型名或字段名后面。

-b

递归的显示块。如果被显示的结构包含子结构,它的所有层次也会被递归的展开并完整显示出来。指针仅在原始结构中显示出来,而不当作子结构展开。

-c

紧凑输出。如果可能的话将所有字段都显示到一行中。(当和-a开关一起使用时,每个数组元素都占据一行而不是被格式化为一个多行的块。)

-e

强制dt枚举类型。该选项仅在dt错误的将NAME当作一个实例而不是类型时使用。

-i

不对子类型进行缩进。

-o

省略掉结构字段的偏移值。

-p

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

-r[depth]

递归的转储子类型字段。如果给定了depth ,递归达到一定深度时就会停止。depth 必须是1到9之间的数字,并且在rdepth 之间不能包含空格。-r[depth] 必须紧靠在地址的前面现。

-s size

仅列举大小的字节数等于size 值的类型。-s 仅在枚举类型时有用。当指定了-s 时,-e 也被隐含的指定了。

-v

详细输出。这会输出结构的总大小和字段数量这样的附加信息。当它和-y选项一起使用时,所有的符号都会被显示出来,即使他们没有任何关联的类型信息。

 

SearchOpts

指定下表中的一个或多个选项。这些选项以连字符开头。

选项

说明

-n

表明下个参数是一个名字。当下一个参数完全由16进制字符组成时使用,否则它会被当作一个地址。

-y

表明下一个参数是一个名字的开头,而不一定是整个名字。包含-y时,只有第一个匹配项会显示出来。如果没有包含-y,只有精确匹配的项会显示。

 

module

用于指定定义该结构的模块的可选参数。如果有一个局部变量或类型的名字和全局变量或类型的名字相同,则需要包含module 来表明它是全局变量。否则,dt命令会显示局部变量,即使和局部变量是不区分大小写的匹配而全局变量是区分大小写的匹配。

NAME

指定类型或全局变量的名字。如果NAME以星号结尾,所有匹配项都会被列举出来。因此,dt A*会显示所有以"A"开头的数据类型、局部变量和静态变量,但是不会显示这些类型实际的实例。(如果同时使用了-v 显示选项,所有符号都会被显示出来 — 不只是具有关联的类型信息的。)也可以将NAME用一个点号(.)代替来说明想使用上一次用过的 NAME 值。如果NAME包含空格,需要用圆括号括起来。

Field

指定要显示的一个或多个字段。如果省略掉Field ,则显示所有字段。如果Field 后跟一个点号(.),则改字段的第一级子字段也会被显示出来。如果Field 后跟一系列的点号,则子字段显示的深度等于点号的个数。任何后面跟有点号的字段名都被当作一个前缀匹配,就像使用了-y搜索选项一样。

Address

指定要显示的结构的地址。如果省略掉NAME,则必须包含Address 并且必须指定全局变量的地址。Address如果没有进行其它指示,则被当作一个虚拟地址。使用-p选项来指定物理地址。用"at" 号( @ )来指定寄存器(例如@eax)。

List

指定连接到一个链表的字段名。必须包含有Address 参数。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

dt 命令的输出总是用10进制显示有符号数,16进制显示无符号数。

dt的所有参数都可以使用符号值,也可以使用字符串通配符。查看字符串通配符语法获得详细信息。

dt 使用到的类型信息包含所有以typedef 创建的类型名、所有Windows定义的类型。例如,unsigned longchar 不是合法的类型名,但是ULONGCHAR 合法。查看Microsoft Windows SDK获得Windows类型名的完整列表。

代码中所有用typedef定义的类型都可用,只要它们在程序中被实际用到了。但是,在头文件中被定义但是从来没有实际用到过的类型不会包含在.pdb 符号文件中,也不能被调试器访问。

任何NAMEField之前都可以有-y-n选项。-y选项使得可以指定类型或结构名的开始部分。例如,dt -y ALLEN 将显示类型ALLENTOWN 的数据。但是,不能使用dt -y A 来显示ALLENTOWN,而因该使用dt -ny A,因为A是一个合法的16进制值,如果没有-n的话会被当作地址。

如果NAME指定了一个结构,它的所有字段都会显示出来(例如,dt myStruct)。如果只需要一个特定的字段,可以使用dt myStruct myField。这样会显示C中称为myStruct.myField的成员。但是,注意命令dt myStruct myField1 myField2显示myStruct.myField1myStruct.myField2,而不是显示myStruct.myField1.myField2

如果结构名或字段后跟一个下标,则表示一个数组的单个实例。例如,dt myStruct myFieldArray[3] 将显示要查询的数组中第四个成员。但是如果是类型名后跟下标,则指定整个数组。例如,dt CHAR[8] myPtr 将显示一个8字符的字符串。不管当前基数是什么,下表总是10进制数,使用0x前缀会产生错误。

由于该命令使用.pdb 文件中的类型信息,所以可以自由的调试任何CPU平台。

如果要显示unicode字符串,需要首先使用.enable_unicode (Enable Unicode Display)命令。可以通过.enable_long_status (Enable Long Integer Display)命令来控制长整形的显示。

下面的例子中,dt显示一个全局变量:

0:000> dt mt1
   +0x000 a                : 10
   +0x004 b                : 98 'b'
   +0x006 c                : 0xdd
   +0x008 d                : 0xabcd
   +0x00c gn               : [6] 0x1
   +0x024 ex               : 0x0

下例中,dt显示数组字段gn

0:000> dt mt1 -a gn 
   +0x00c gn : 
    [00] 0x1
    [01] 0x2
    [02] 0x3
    [03] 0x4
    [04] 0x5
    [05] 0x6

下面的命令显示变量的一些子字段:

0:000> dt mcl1 m_t1 dpo 
   +0x010 dpo  : DEEP_ONE
   +0x070 m_t1 : MYTYPE1

这个命令显示m_t1子字段。因为点号自动产生前缀匹配,所以也会显示所有以"m_t1"开头的子字段:

0:000> dt mcl1 m_t1. 
   +0x070 m_t1  : 
      +0x000 a     : 0
      +0x004 b     : 0 ''
      +0x006 c     : 0x0
      +0x008 d     : 0x0
      +0x00c gn    : [6] 0x0
      +0x024 ex    : 0x0

可以重复任意深度。例如命令dt mcl1 a..c. 会显示深度为4的所有字段,并且第一个字段名以a开头,第三个字段名以c开头。

这里是如何显示子字段的一个更详细的示例。首先显示Ldr域:

0:000> dt nt!_PEB Ldr 7ffdf000
   +0x00c Ldr : 0x00191ea0

然后展开该指针类型的字段:

0:000> dt nt!_PEB Ldr Ldr. 7ffdf000 
   +0x00c Ldr  : 0x00191ea0
      +0x000 Length : 0x28
      +0x004 Initialized : 0x1 ''
      +0x008 SsHandle : (null)
      +0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
      +0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
      +0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
      +0x024 EntryInProgress : (null)

现在显示CriticalSectionTimeout字段:

0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000 
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000

在第一级深度展开CriticalSectionTimeout结构的子字段:

0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000 
   +0x070 CriticalSectionTimeout  :  0xffffe86d`079b8000
      +0x000 LowPart                 : 0x79b8000
      +0x004 HighPart                : -6035
      +0x000 u                       : __unnamed
      +0x000 QuadPart                : -25920000000000

现在展开CriticalSectionTimeout 结构的第二级子字段:

0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000 
   +0x070 CriticalSectionTimeout   :  0xffffe86d`079b8000
      +0x000 LowPart                  : 0x79b8000
      +0x004 HighPart                 : -6035
      +0x000 u                        :
         +0x000 LowPart                  : 0x79b8000
         +0x004 HighPart                 : -6035
      +0x000 QuadPart                 : -25920000000000

下面的命令显示位于0x0100297C 的一个MYTYPE1 的数据类型的示例:

0:000> dt 0x0100297c MYTYPE1 
   +0x000 a                : 22
   +0x004 b                : 43 '+'
   +0x006 c                : 0x0
   +0x008 d                : 0x0
   +0x00c gn               : [6] 0x0
   +0x024 ex               : 0x0

下面的命令显示地址0x01002BE0处的10个ULONG的数组:

0:000> dt -ca10 ULONG 01002be0 
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0

这个命令在另一个地址继续使用上面的显示。注意不需要再重新输入"ULONG":

0:000> dt -ca4 . 01002d00 
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2

这是一些类型显示的示例。下面的命令显示thismodule中所有以"MY"开头的类型和全局变量。具有地址前缀的是实际的实例,而没有地址的是类型定义:

0:000> dt thismodule!MY*
010029b8  thismodule!myglobal1
01002990  thismodule!myglobal2
          thismodule!MYCLASS1
          thismodule!MYCLASS2
          thismodule!MYCLASS3
          thismodule!MYTYPE3::u
          thismodule!MYTYPE1
          thismodule!MYTYPE3
          thismodule!MYTYPE3
          thismodule!MYFLAGS

当进行类型显示时,-v 选项可以用来显示每个项目的大小。-s size 选项用来仅枚举指定大小的项。同样,有地址前缀的表示实例,没有地址的表示是类型定义:

0:001> dt -s 2 -v thismodule!*
Enumerating symbols matching thismodule!*, Size = 0x2
Address   Size Symbol
           002 thismodule!wchar_t
           002 thismodule!WORD
           002 thismodule!USHORT
           002 thismodule!SHORT
           002 thismodule!u_short
           002 thismodule!WCHAR
00427a34   002 thismodule!numberOfShips
00427a32   002 thismodule!numberOfPlanes
00427a30   002 thismodule!totalNumberOfItems

这是一个使用-b选项的示例。结构被展开并且结构中的OwnerThreads 数组也被展开,但是并不跟踪FlinkBlink链表指针:

kd> dt nt!_ERESOURCE -b 0x8154f040
   +0x000 SystemResourcesList :  [ 0x815bb388 - 0x816cd478 ]
      +0x000 Flink            : 0x815bb388
      +0x004 Blink            : 0x816cd478
   +0x008 OwnerTable       : (null)
   +0x00c ActiveCount      : 1
   +0x00e Flag             : 8
   +0x010 SharedWaiters    : (null)
   +0x014 ExclusiveWaiters : (null)
   +0x018 OwnerThreads     :
    [00]
      +0x000 OwnerThread      : 0
      +0x004 OwnerCount       : 0
      +0x004 TableSize        : 0
    [01]
      +0x000 OwnerThread      : 0x8167f563
      +0x004 OwnerCount       : 1
      +0x004 TableSize        : 1
   +0x028 ContentionCount  : 0
   +0x02c NumberOfSharedWaiters : 0
   +0x02e NumberOfExclusiveWaiters : 0
   +0x030 Address          : (null)
   +0x030 CreatorBackTraceIndex : 0
   +0x034 SpinLock         : 0

这是一个内核模式的dt示例。下面的命令处理结果类似!process 0 0

kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0
ActiveProcessLinks.Flink at 0x814856f0
---------------------------------------------
UniqueProcessId : 0x00000008
ImageFileName : [16] "System"

ActiveProcessLinks.Flink at 0x8138a030
---------------------------------------------
UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"

ActiveProcessLinks.Flink at 0x81372368
---------------------------------------------
UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"

ActiveProcessLinks.Flink at 0x81369930
---------------------------------------------
UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"

....

如果要对列表中的每一项执行命令,使用!list扩展。

最后,dt -h 命令可以显示dt语法的简短帮助文本。

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

dv (Display Local Variables)

dv 命令显示当前作用域的所有局部变量的名字和值。

语法

dv [Flags] [Pattern

参数

Flags

使得显示附加信息。可以包含下面的任何大小写敏感的Flags

/f <addr>

允许指定一个任意的函数地址,所以可以用它来查看任何地方的任何代码处有些什么参数和局部变量。它会关闭对值得显示并隐含/V/f 必须是最后一个标志。它后面可以跟一个用引号括起来的参数过滤模板。

/i

使得输出中显示变量的类型:局部、全局、参数、函数或未知。

/t

使得显示总包含每个局部变量的数据类型。

/v

显示中包含每个局部变量的虚拟内存地址或寄存器位置。

/V

/v一样,并且还包含和相应的寄存器有关联的局部变量的地址。

/a

将地址以从小到大的顺序排序后输出。

/A

将地址以从大到小的顺序排序后输出。

/n

将名字以升序排序之后显示输出。

/N

将名字以降序排序之后显示输出。

/z

将大小以升序排序之后显示输出。

/Z

将大小以降序排序之后显示输出。

Pattern

使得命令仅显示和指定的Pattern 匹配的局部变量。该模板可以包含各种通配符和修饰符,查看字符串通配符语法获取详细信息。如果Pattern 包含空格,必须使用引号括起来。如果省略掉Pattern ,则显示所有局部变量。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

在详细模式下,每个变量的地址也会显示出来。(这也可以通过x (Examine Symbols) 命令实现)

数据结构和陌生的数据类型不会完整显示,而只显示他们的类型名。要显示整个结构或结构中的特定成员,使用dt (Display Type) 命令。

局部上下文决定了现实的局部变量的集合。默认情况下,该上下文喝当前程序计数器的位置相匹配。关于如何改变它的信息,查看局部上下文

附加信息

关于内存操作和内存相关的命令的概述,查看读写内存

posted on 2008-06-13 15:17 NetRoc 阅读(738) 评论(2)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(6)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜