WinDBG的命令类别?
The categories of commands of WinDBG?
我看到一些关于 WinDBG 命令的参考资料和教程。
其中一些喜欢这个 lm
、这个 .echo
、这个 !running
和这个 nt!_PDB
.
这些类别有什么区别
- xxx
- .xxx
- !xxx
- xxx!yyy
?
他们看起来很困惑。
查看以下内容:
xxx - these are built in commands
.xxx - these are meta commands
!xxx - these are extension commands, so they call a command from an extension dll
xxx!yyy - this looks the syntax to reference an exported function from a dll:
<dll_name>!<method_name>
您可能会发现以下内容有用:http://windbg.info/doc/1-common-cmds.html
有内置命令、元命令(点命令)和扩展命令(bang命令)。
我个人的看法是,您不必太在意内置命令与元命令相比的区别,因为有足够多的例子表明这些定义不匹配。知道它们始终存在并且不需要加载扩展就足够了。
内置命令的好例子,主要是关于控制和从调试目标获取信息:
g - go
k - call stack
~ - list threads
恕我直言,此定义不真正匹配的示例:
version - show version of the debugger
vercommand - show command line that was used to start the debugger
n - set number base
元命令的好例子,这些命令被认为只影响调试器而不影响目标:
.cls - clear screen
.chain - display loaded extensions
.effmach - change behavior of the debugger regarding the architecture
.prefer_dml - change output format
恕我直言,这个定义并不真正匹配的示例:
.lastevent - show last exception or event that occurred (in the target)
.ttime - display thread times (of the target)
.call - call a function (in the target)
.dvalloc - allocate memory (in the target)
但是,最好理解扩展命令是不同的,特别是因为相同的命令可能会导致不同的输出,具体取决于哪个扩展被加载或首先出现在扩展列表中,并且您可以影响顺序 (例如 .load
、.unload
、.setdll
)。除了简单形式 !command
之外,请注意还有 !extension.command
语法来明确指定扩展名。我将在下面的示例中使用它。 (甚至还有!c:\path\to\extension.command
)
内核调试会话中给出了扩展命令冲突的示例,其中一个 !heap
没有给出任何输出,而另一个显然需要一个参数才能工作。
0: kd> !ext.heap
0: kd> !exts.heap
Invalid type information
你问题中最后提到的格式(xxx!yyy
)不是命令,而是方法或类型信息,其中xxx表示模块(DLL),yyy表示方法或类型名称。通常,对于方法内的位置 (xxx!yyy+0xhhh
)
,也会看到以字节为单位的额外偏移量
我看到一些关于 WinDBG 命令的参考资料和教程。
其中一些喜欢这个 lm
、这个 .echo
、这个 !running
和这个 nt!_PDB
.
这些类别有什么区别
- xxx
- .xxx
- !xxx
- xxx!yyy
?
他们看起来很困惑。
查看以下内容:
xxx - these are built in commands
.xxx - these are meta commands
!xxx - these are extension commands, so they call a command from an extension dll
xxx!yyy - this looks the syntax to reference an exported function from a dll:
<dll_name>!<method_name>
您可能会发现以下内容有用:http://windbg.info/doc/1-common-cmds.html
有内置命令、元命令(点命令)和扩展命令(bang命令)。
我个人的看法是,您不必太在意内置命令与元命令相比的区别,因为有足够多的例子表明这些定义不匹配。知道它们始终存在并且不需要加载扩展就足够了。
内置命令的好例子,主要是关于控制和从调试目标获取信息:
g - go
k - call stack
~ - list threads
恕我直言,此定义不真正匹配的示例:
version - show version of the debugger
vercommand - show command line that was used to start the debugger
n - set number base
元命令的好例子,这些命令被认为只影响调试器而不影响目标:
.cls - clear screen
.chain - display loaded extensions
.effmach - change behavior of the debugger regarding the architecture
.prefer_dml - change output format
恕我直言,这个定义并不真正匹配的示例:
.lastevent - show last exception or event that occurred (in the target)
.ttime - display thread times (of the target)
.call - call a function (in the target)
.dvalloc - allocate memory (in the target)
但是,最好理解扩展命令是不同的,特别是因为相同的命令可能会导致不同的输出,具体取决于哪个扩展被加载或首先出现在扩展列表中,并且您可以影响顺序 (例如 .load
、.unload
、.setdll
)。除了简单形式 !command
之外,请注意还有 !extension.command
语法来明确指定扩展名。我将在下面的示例中使用它。 (甚至还有!c:\path\to\extension.command
)
内核调试会话中给出了扩展命令冲突的示例,其中一个 !heap
没有给出任何输出,而另一个显然需要一个参数才能工作。
0: kd> !ext.heap
0: kd> !exts.heap
Invalid type information
你问题中最后提到的格式(xxx!yyy
)不是命令,而是方法或类型信息,其中xxx表示模块(DLL),yyy表示方法或类型名称。通常,对于方法内的位置 (xxx!yyy+0xhhh
)