命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块。 大多数标准命令是一两个字符或者符号, 只有version等少数命令除外。
测试代码
namespace WinDbgConsoleSearch { internal class Program { private static int i; private static object _locker = new object(); static void Main(string[] args) { Console.WriteLine("Hello WinDbg"); Test test1 = new Test { TestId = 1,TestName = "Test1" }; Test test2 = new Test { TestId = 2, TestName = "Test2" }; Task1(); Task2(); Console.ReadLine(); } private static void Task1() { Task.Run(async() => { while (i< 1000) { lock (_locker) { i++; } Console.WriteLine(i); await Task.Delay(1000); } }); } private static void Task2() { Task.Run(async () => { while (i < 1000) { lock (_locker) { i++; } Console.WriteLine(i); await Task.Delay(1000); } }); } } public class Test { public int TestId { get; set; } public string TestName { get; set; }
}
}
代码环境是.net 4.6.2
好了,开始上手WinDbg,首先点【文件】-【Attact to process】,然后找到我们进程双击附加上
? 查看标准命令
按照输出的所有命令从上往下过:
BC 清除断点
BD 禁用断点
BE 使能断点
BL 列出所有断点
BA 硬件断点
BP 软件断点
D* 显示给定范围内的内存内容
d, da, db, dc, dd, dD, df, dp, dq, du, dw
d{a|b|c|d|D|f|p|q|u|w|W} [Options] [Range]
dy{b|d} [Options] [Range]
d [Options] [Range]
DT 显示类型
Display Type显示有关局部变量、全局变量或数据类型的信息。
这可以显示有关简单数据类型以及结构和联合的信息。
用户模式语法:
dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
内核模式语法:
[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
参数:
Processor:指定运行包含所需信息的进程的处理器。只能在内核模式下指定处理器。
DisplayOpts:
选项 | 描述 |
---|---|
-a[quantity] | 在新行上显示每个数组元素及其索引。将显示数量元素的总数。a 和数量之间不能有空格。如果 -a 后面没有数字,则显示数组中的所有项目。-a[quantity] 开关应紧挨着要以这种方式显示的每个类型名称或字段名称之前出现。 |
-b | 以递归方式显示块。如果显示的结构包含子结构,则会递归地将其展开到任意深度并完整显示。仅当指针位于原始结构中而不是子结构中时,才会展开指针。 |
-c | 紧凑的输出。如果可能,所有字段都显示在一行上。(当与 -a 开关一起使用时,每个数组元素采用一行,而不是格式化为多行块。 |
-d | 当与以星号结尾的 Name 一起使用时,显示以 Name 开头的所有类型的详细输出。如果 Name 不以星号结尾,则显示详细输出。 |
-e | 强制 dt 枚举类型。仅当 dt 错误地将 Name 值解释为实例而不是类型时,才需要此选项。 |
-i | 不要缩进子类型。 |
-o | 省略结构字段的偏移值。 |
-p | 地址是物理地址,而不是虚拟地址 |
-r[depth] | 以递归方式转储子类型字段。如果给定深度,则此递归将在深度级别后停止。深度必须是介于 1 和 9 之间的数字,并且 r 和深度之间不得有空格。-r[depth] 开关应紧挨着地址出现。 |
-s size | 仅枚举其大小(以字节为单位)等于 size 值的类型。-s 选项仅在枚举类型时才有用。当指定 -s 时,-e 也始终是隐含的。 |
-t | 仅枚举类型。 |
-v | 详细输出。这提供了额外的信息,例如结构的总尺寸及其元素的数量。当它与 -y 搜索选项一起使用时,将显示所有符号,即使是那些没有关联类型信息的符号。 |
SearchOpts
选项 | 描述 |
---|---|
-n | 这表示下一个参数是名称。如果下一项完全由十六进制字符组成,则应使用此项,否则它将被视为地址。 |
-y | 这表示下一个参数是名称的开头,不一定是整个名称。当包含 -y 时,将列出所有匹配项,后跟列表中第一个匹配项的详细信息。如果不包括 -y,则仅显示完全匹配项。 |
module
一个可选参数,指定定义此结构的模块。如果存在与全局变量或类型同名的局部变量或类型,则应包含 module 以指定您表示的全局变量。否则,dt 命令将显示局部变量,即使局部变量是不区分大小写的匹配项,而全局变量是区分大小写的匹配项。
Name
指定类型或全局变量的名称。如果名称以星号 () 结尾,则显示所有匹配项的列表。因此,dt A 将列出以“A”开头的所有数据类型、全局变量和静态数据,但不会显示这些类型的实际实例。(如果同时使用 -v 显示选项,则将显示所有符号,而不仅仅是具有关联类型信息的符号。还可以将 Name 替换为句点 (.),以表示要重复最近使用的 Name 值。
如果 Name 包含空格,则应将其括在括号中。
Field
指定要显示的字段。如果省略字段,则显示所有字段。如果字段后跟句点 (.),则也会显示此字段的第一级子字段。如果“字段”后面跟着一系列句点,则子字段的显示深度将与句点数相等。任何后跟句点的字段名称都将被视为前缀匹配,就像使用了 -y 搜索选项一样。如果字段后跟星号 (*),则仅将其视为字段的开头,而不一定是整个字段,并显示所有匹配的字段。
Address
指定要显示的结构的地址。如果省略 Name,则必须包含 Address,并且必须指定全局变量的地址。除非另有说明,否则地址被视为虚拟地址。使用 -p 选项指定物理地址。使用“@”符号指定寄存器(例如,@eax)。
List
指定链接链表的字段名称。必须包含 Address 参数
DV 显示当前作用域中所有局部变量的名称和值
dv [Flags] [Pattern] 参数:Flags
参数 | 描述 |
---|---|
/f |
允许您指定任意函数地址,以便您可以查看任何位置的任何代码都存在哪些参数和局部变量。它关闭值显示并暗示 /V。/f 标志必须是最后一个标志。如果字符串被引用,则仍可以在其后指定参数筛选器模式。 |
/i | 使显示指定变量的类型:本地、全局、参数、函数或未知。 |
/t | 使显示包含每个局部变量的数据类型。 |
/v | 使显示包含每个局部变量的虚拟内存地址或寄存器位置。 |
/V | 与/v相同,还包括局部变量相对于相关寄存器的地址。 |
/a | 按地址升序对输出进行排序 |
/A | 按地址降序对输出进行排序 |
/n | 按名称对输出进行升序排序 |
/N | 按名称对输出进行降序排序 |
/z | 按大小升序对输出进行排序 |
/Z | 按大小降序对输出进行排序 |
Pattern
使命令仅显示与指定模式匹配的局部变量。 该模式可能包含各种通配符和说明符; 参阅字符串通配符语法。 如果 Pattern 包含空格,则必须将其括在引号中。 如果省略 Pattern,将显示所有局部变量。
DX 显示调试器对象模型表达式
dx [-g|-gc #][-c #][-n|-v]-r[#] Expression[,
dx [{-?}|{-h}]
参数:
E* 将指定的值输入内存
e{b|d|D|f|p|q|w} Address [Values]
e{a|u|za|zu} Address "String"
e Address [Values]
参数:
Address
指定输入值的起始地址。 调试器替换地址和每个后续内存位置处的值,直到使用所有值。
Values
指定要输入内存的一个或多个值。 多个数值应使用空格分隔。 如果不指定任何值,将显示当前地址和该地址处的值,并提示您输入。
String
指定要输入内存的字符串。 ea 和 eza 命令会将其作为 ASCII 字符串写入内存; eu 和 ezu 命令会将其作为 Unicode 字符串写入内存。 eza 和 ezu 命令写入终端 NULL; ea 和 eu 命令没有。 字符串必须用引号引起来。
g 开始执行给定的进程或线程
用户模式语法:[~Thread] g[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
内核模式语法:
g[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
参数:
Thread
指定要执行的线程
a
使此命令创建的任何断点成为处理器断点(如 ba 创建的断点)而不是软件断点(如 bp 和 bm 创建的断点)。 如果未指定 BreakAddress,则不会创建断点并且 a 标志不起作用。
StartAddress
指定执行开始的地址。 如果未指定,调试器会将执行传递到指令指针当前值指定的地址
BreakAddress
指定断点的地址。 如果指定BreakAddress,则必须指定指令地址(即该地址必须包含指令的第一个字节)。 一次最多可以以任意顺序指定十个中断地址。 如果无法解析 BreakAddress,则将其存储为未解析的断点
BreakCommands
指定当遇到由 BreakAddress 指定的断点时自动执行的一个或多个命令。 BreakCommands 参数前面必须有分号。 如果指定了多个 BreakAddress 值,则 BreakCommands 将应用于所有这些值。
仅当您将此命令嵌入到另一个命令使用的命令字符串中时,BreakCommands 参数才可用 - 例如,嵌入到另一个断点命令中或异常或事件设置中。 在命令行上,分号将终止 g 命令,分号后面列出的任何其他命令将在 g 命令完成后立即执行。
K* 显示给定线程的堆栈以及相关信息
参数
Thread
指定要显示其堆栈的线程。 如果省略该参数,则显示当前线程的堆栈
Processor
指定要显示其堆栈的处理器
b
显示传递给堆栈跟踪中每个函数的前三个参数
c
显示干净的堆栈跟踪。 每行显示仅包含模块名称和函数名称
p
显示堆栈跟踪中调用的每个函数的所有参数。 参数列表包括每个参数的数据类型、名称和值。 p 选项区分大小写。 该参数需要完整的符号信息。
P(大写)
显示堆栈跟踪中调用的每个函数的所有参数,功能参数打印在显示屏的第二行,而不是与其余数据在同一行。
v
显示帧指针省略 (FPO) 信息。 在基于 x86 的处理器上,显示还包括调用约定信息。
n
显示帧编号
f
显示相邻帧之间的距离。 该距离是实际堆栈上分隔帧的字节数
L
在显示中隐藏源行
M
使用调试器标记语言显示输出。 显示中的每个帧编号都是一个链接,您可以单击该链接来设置局部上下文并显示局部变量
FrameCount
指定要显示的堆栈帧数。 您应该以十六进制格式指定此数字,除非您已使用 n(设置数字基数)命令更改了基数。 默认值为 20 (0x14),除非您使用 .kframes(设置堆栈长度)命令更改了默认值。
BasePtr
指定堆栈跟踪的基指针。 仅当命令后有等号 (=) 时,BasePtr 参数才可用。
StackPtr
指定堆栈跟踪的堆栈指针。 如果省略 StackPtr 和InstructionPtr,则该命令将使用 rsp(或 esp)寄存器指定的堆栈指针和 rip(或 eip)寄存器指定的指令指针。
InstructionPtr
指定堆栈跟踪的指令指针。 如果省略 StackPtr 和InstructionPtr,则该命令将使用 rsp(或 esp)寄存器指定的堆栈指针和 rip(或 eip)寄存器指定的指令指针。
WordCount
指定堆栈中要转储的 DWORD_PTR 值的数量。 默认值为 20 (0x14),除非您使用 .kframes(设置堆栈长度)命令更改了默认值
LM 显示指定加载的模块
lmOptions [a Address] [m Pattern | M Pattern]参数:
D
DML格式输出
o
只显示已经加载的模块
l
只显示已加载符号信息的模块
v
导致显示内容冗长。 显示内容包括符号文件名、图像文件名、校验和信息、版本信息、日期戳、时间戳以及有关模块是否为托管代码 (CLR) 的信息。 如果相关标头丢失或调出,则不会显示此信息。
u(内核模式)
仅显示用户模式符号信息
k(内核模式)
仅显示内核模式符号信息
e
仅显示有符号问题的模块。 这些符号包括没有符号的模块和符号状态为 C、T、#、M 或 Export 的模块
c
显示校验数据
1m
减少输出,以便除了模块名称之外不包含任何内容。 如果您使用 .foreach 标记将命令输出通过管道传输到另一个命令的输入,则此选项非常有用。
sm
按模块名称而不是起始地址对显示进行排序。
此外,您只能包含以下选项之一。 如果不包含任何这些选项,则显示内容包含符号文件名
i
显示镜像文件名
f
显示完整镜像路径。 (此路径始终与初始加载通知中显示的路径匹配,除非您发出 .reload -s 命令。)使用 f 时,不会显示符号类型信息。
n
显示镜像名称,当使用n时,不显示符号类型信息
p
显示映射的镜像名称。 使用 p 时,不显示符号类型信息
t
显示文件时间戳。 当您使用 t 时,不显示符号类型信息。
a Address
指定该模块中包含的地址。 仅显示包含该地址的模块。 如果 Address 包含表达式,则必须将其括在括号中
m Pattern
指定模块名称必须匹配的模式。 模式可以包含各种通配符和说明符
M Pattern
指定镜像路径必须匹配的模式。 模式可以包含各种通配符和说明符
注意:大多数情况下,模块名称是不带文件扩展名的文件名。 例如,如果要显示有关 Flpydisk.sys 驱动程序的信息,请使用 lm mflpydisk 命令,而不是 lm mflpydisk.sys
ln 显示给定地址处或附近的符号
ln Address
ln /D Address
参数
Address
指定调试器应开始搜索符号的地址。显示地址之前或之后最近的符号
/D
以DML格式
p 单步执行
用户模式语法:
[~Thread] p[r] [= StartAddress] [Count] ["Command"]
内核模式语法:
p[r] [= StartAddress] [Count] ["Command"]
参数
Thread
指定继续执行的线程。 所有其他线程都被冻结
r
打开和关闭寄存器和标志的显示。 默认情况下,显示寄存器和标志。 您可以使用 pr、tr 或 .prompt_allow -reg 命令禁用寄存器显示。 所有这三个命令控制相同的设置,您可以使用其中任何一个来覆盖以前使用的这些命令。
您还可以使用 l-os 命令禁用寄存器显示。 此设置与其他三个命令分开。 要控制显示哪些寄存器和标志,请使用 rm(寄存器掩码)命令。
StartAddress
指定执行开始的地址。 如果不使用 StartAddress,则从指令指针指向的指令开始执行
Count
指定停止之前要单步执行的指令或源代码行数。 每个步骤在调试器命令窗口中显示为单独的操作。 默认值为1
Command
指定执行该步骤后要执行的调试器命令。 该命令在显示标准 p 结果之前执行。 如果您还使用 Count,则在所有单步完成后(但在显示最后一步的结果之前)执行指定的命令。
q 结束调试会话
在用户模式调试中,q 命令结束调试会话并关闭目标应用程序。
在内核模式调试中,q 命令保存日志文件并结束调试会话。 目标计算机保持锁定状态。
R 显示或修改寄存器、浮点寄存器、标志、伪寄存器和固定名称别名
用户模式语法:
[~Thread] r[M Mask|F|X|?] [ Register[:[Num]Type] [= [Value]] ]
r.
内核模式语法:
[Processor] r[M Mask|F|X|Y|YI|?] [ Register[:[Num]Type] [= [Value]] ]
r.
参数
Processor
指定从中读取寄存器的处理器。 默认值为零。 如果指定 Processor,则不能包含 Register 参数 - 将显示所有寄存器。
Thread
指定从中读取寄存器的线程。 如果不指定线程,则使用当前线程。
M Mask
指定调试器显示寄存器时要使用的掩码。 “M”必须是大写字母。 掩码是指示有关寄存器显示的某些信息的位的总和。 这些位的含义取决于处理器和模式(有关详细信息,请参阅以下备注部分中的表格)。 如果省略 M,则使用默认掩码。 您可以使用 Rm(注册掩码)命令设置或显示默认掩码。
F
显示浮点寄存器。 “F”必须是大写字母。 该选项相当于M 0x4。
X
显示 SSE XMM 寄存器。 该选项相当于M 0x40。
Y
显示 AVX YMM 寄存器。 该选项相当于M 0x200。
YI
显示 AVX YMM 整数寄存器。 该选项相当于M 0x400。
?
(仅限伪寄存器分配)使伪寄存器获取类型化信息。 任何类型都是允许的
Register
指定要显示或修改的寄存器、标志、伪寄存器或固定名称别名。
Num
指定要显示的元素数。 如果省略此参数但包含 Type,则会显示完整的寄存器长度。
Type
指定显示每个寄存器元素的数据格式。只能将 Type 与 64 位和 128 位向量寄存器一起使用。 可以指定多种类型。
可以指定以下一个或多个值
Type | 显示格式 |
---|---|
ib | Signed byte |
ub | Unsigned byte |
iw | Signed word |
uw | Unsigned word |
id | Signed DWORD |
ud | Unsigned DWORD |
iq | Signed quad-word |
uq | Unsigned quad-worde |
f | 32-bit floating-point |
d | 64-bit floating-point |
Value
指定要分配给寄存器的值
.
显示当前指令中使用的寄存器。 如果不使用寄存器,则不显示任何输出。
S 搜索内存
- s [-[[Flags]Type]] Range Pattern
- s -[[Flags]]v Range Object
- s -[[Flags]]sa Range
- s -[[Flags]]su Range
参数
[ Flags]
指定一个或多个搜索选项。 每个标志都是一个字母。 您必须将标志括在一组方括号 ([]) 中。 括号之间不能添加空格,n 或 l 及其参数之间除外。 例如,如果要指定 s 和 w 选项,请使用命令 s -[sw]Type Range Pattern。
可以指定以下一个或多个标志
s
保存当前搜索的所有结果。 您可以使用这些结果稍后重复搜索
r
将当前搜索限制为上次保存的搜索的结果。 不能在同一命令中使用 s 和 r 标志。 当您使用 r 时,Range 的值将被忽略,并且调试器仅搜索由先前 s 命令保存的那些命中
n Hits
指定使用 s 标志时要保存的命中数。 默认值为 1024 次点击。 如果将 n 与其他标志一起使用,则 n 必须是最后一个标志,后跟其 Hits 参数。 n 和 Hits 之间的空格是可选的,但您不能在方括号内添加任何其他空格。 如果任何使用 s 标志的后续搜索发现超过指定数量的命中,则会显示溢出错误消息,通知您并非所有命中都被保存
l Length
导致对任意 ASCII 或 Unicode 字符串的搜索仅返回长度至少为 Length 个字符的字符串。 默认长度为 3。该值仅影响使用 -sa 或 -su 标志的搜索。
w
仅搜索可写内存区域。 必须将“w”括在括号中。
1
仅显示搜索输出中搜索匹配的地址。 如果您使用 .foreach 标记将命令输出通过管道传输到另一个命令的输入,则此选项非常有用。
Type
指定要搜索的内存类型。 在 Type 前面添加连字符 (-)。 可以使用以下类型值之一
Type | 描述 |
---|---|
b | Byte (8 bits) |
w | WORD (16 bits) |
d | DWORD (32 bits) |
q | QWORD (64 bits) |
a | ASCII string(not necessarily a null-terminated string) |
u | Unicode string(not necessarily a null-terminated string) |
如果省略 Type,则使用字节值。 但是,如果使用 Flags,则不能省略 Type。
sa
搜索包含可打印 ASCII 字符串的任何内存。 使用 l Length 标志指定此类字符串的最小长度。 默认最小长度为 3 个字符。
su
搜索包含可打印 Unicode 字符串的任何内存。 使用 l Length 标志指定此类字符串的最小长度。 默认最小长度为 3 个字符。
Range
指定要搜索的内存区域。 该范围的长度不能超过 256 MB,除非您使用 L? 句法
Pattern
指定要搜索的一个或多个值。 默认情况下,这些值是字节值。 您可以在 Type 中指定不同类型的内存。 如果指定 WORD、DWORD 或 QWORD 值,请将其括在单引号中(例如“Tag7”)。 如果指定字符串,请将其括在双引号中(例如“This string”)
-v
搜索与指定对象相同类型的对象
Object
指定对象的地址或指向对象的指针的地址。 然后,调试器搜索与 Object 指定的对象类型相同的对象。
SX* 控制调试器在正在调试的应用程序中发生异常或发生某些事件时所采取的操作
sxsx{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2"] [-h] {Exception|Event|*}
sx- [-c "Cmd1"] [-c2 "Cmd2"] {Exception|Event|*}
sxr
参数
-c "Cmd1"
指定发生异常或事件时执行的命令。 当第一次有机会处理此异常时,将执行此命令,无论此异常是否中断到调试器。 您必须将 Cmd1 字符串括在引号中。 该字符串可以包含多个命令,以分号分隔。 -c 和带引号的命令字符串之间的空格是可选的。
-c2"Cmd2"
指定在发生异常或事件且未第一时间处理时执行的命令。 当第二次处理此异常的机会发生时,将执行此命令,无论此异常是否中断到调试器。 您必须将 Cmd2 字符串括在引号中。 该字符串可以包含多个命令,以分号分隔。 -c2 和带引号的命令字符串之间的空格是可选的。
-h
更改指定事件的处理状态而不是其中断状态。 如果事件是 cc、hc、bpec 或 ssec,则不必使用 -h 选项。
Exception
以当前基数指定命令所作用的异常编号
Event
指定命令所作用的事件。 这些事件通过简短的缩写来标识。
*
影响未以其他方式明确命名为 sx 的所有异常
t 单步步入
用户模式语法:
[~Thread] t [r] [= StartAddress] [Count] ["Command"]
内核模式语法:
t [r] [= StartAddress] [Count] ["Command"]
参数
Thread
指定要解冻的线程。 所有其他线程都被冻结
r
打开和关闭寄存器和标志的显示。 默认情况下,显示寄存器和标志。 您可以使用 pr、tr 或 .prompt_allow -reg 命令禁用寄存器显示。 所有这三个命令控制相同的设置,您可以使用其中任何一个来覆盖以前使用的这些命令。
您还可以使用 l-os 命令禁用寄存器显示。 此设置与其他三个命令分开。 要控制显示哪些寄存器和标志,请使用 rm(寄存器掩码)命令
StartAddress
指定执行开始的地址。 如果不使用 StartAddress,则从指令指针指向的指令开始执行
Count
指定停止之前要跟踪的指令或源代码行数。 每个步骤在调试器命令窗口中显示为单独的操作。 默认值为1
Command
指定执行跟踪后要执行的调试器命令。 该命令在显示标准 t 结果之前执行。 如果您还使用 Count,则在所有跟踪完成后(但在显示最终跟踪的结果之前)执行此命令。
u* 显示内存中指定程序代码的汇编翻译
u[u|b] Range
u[u|b] Address
u[u|b]
参数
Range
指定包含要反汇编的指令的内存范围。 有关语法的详细信息,请参阅地址和地址范围语法。 如果使用 b 标志,则必须使用“Address LLength”语法而不是“Address1 Address2”语法指定 Range。
Address
指定要反汇编的内存范围的开头。 八条指令(在基于 x86 的处理器上)或九条指令(在基于 Itanium 的处理器上)未汇编
b
通过向后计数确定要反汇编的内存范围。 如果使用 ub Address,则反汇编范围将为以 Address 结尾的八个或九个字节范围。 如果使用语法 ub Address LLength 指定范围,则反汇编的范围将是以 Address 结尾的指定长度范围。
u
指定即使存在内存读取错误,反汇编也将继续
version 显示版本相关信息
显示有关调试器和所有加载的扩展 DLL 的版本信息。 此命令还显示目标计算机操作系统的当前版本。
x 检查符号
显示所有上下文中与指定模式匹配的符号x [Options] Module!Symbol
x [Options] *
参数
-
Options
指定符号搜索选项。 您可以使用以下一个或多个选项:- /0 仅显示每个符号的地址
- /1 仅显示每个符号的名称
- /2 仅显示每个符号的地址和名称(不显示数据类型)
- /D DML格式输出
- /t 如果数据类型已知,则显示每个符号的数据类型
- /v 显示每个符号的符号类型(本地、全局、参数、函数或未知)。 此选项还显示每个符号的大小。 函数符号的大小是函数在内存中的大小。 其他符号的大小是该符号表示的数据类型的大小。 大小始终以字节为单位测量并以十六进制格式显示
- /s Size 仅显示大小(以字节为单位)等于 Size 值的符号。 函数符号的大小是函数在内存中的大小。 其他符号的大小是该符号表示的数据类型的大小。 始终显示无法确定大小的符号。 大小必须是非零整数
- /q 以引号格式显示符号名称
- /p 当调试器显示函数名称及其参数时,省略左括号前的空格。 如果您将函数名称和参数从 x 显示复制到另一个位置,这种显示会更容易
- /f 显示函数的数据大小
- /d 显示数据的大小
- /a 按地址升序显示
- /A 按地址降序显示
- /n 按名称升序显示
- /N 按名称降序显示
- /z 按大小升序显示
- /Z 按大小降序显示
-
Module
指定要搜索的模块。 该模块可以是 .exe、.dll 或 .sys 文件。 模块可以包含各种通配符和说明符 -
Symbol
指定符号必须包含的模式。 符号可以包含各种通配符和说明符。 有关语法的更多信息,请参阅字符串通配符语法。由于此模式与符号匹配,因此匹配不区分大小写,并且单个前导下划线 (_) 表示 任意数量的前导下划线。 您可以在 Symbol 中添加空格,这样您就可以指定包含 空格的符号名称(例如“operator new”或“Template<A, B>”),而无需使用通 配符