Debugging Tools for 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 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


Build machine: CAPEBUILD