从6.6.07版的调试器开始,为了增强和扩展调试器的数据输出,将使用新的机制:debuggermarkup language (DML)。DML象HTML那样允许在一定格式的标记中包含指令和不显示的信息。调试器的用户界面将能分析额外的信息并提供新的特性。调试器命令可以以纯文本或使用调试器标记语言(DML)的增强格式提供输出。使用DML增强的输出包括可以单击以执行相关命令的链接。
DML的两个主要的功能
- 链接相关信息。DML中的一个link标记能产生一个相关信息的链接,并允许通过一定的操作访问它。就象HTML中的链接一样,允许用户快速定位超级链接中的信息。
- 调试器及其扩展功能的输出特性。调试器及其扩展拥有很强大的功能,但是关于外观显示的却很少。用户必须知道什么是可用的,这意味着用户通常不知道什么命令能帮助他们。DML链接允许将任意指令封装在预备的外观中,例如说明文本,菜单或者帮助链接。
关于理解什么是DML的另一个关键
- DML不是HTML.DML有意设计得很简单,只有一些标记。为了保留简易性,DML将不会发展成图象显示功能完善的语言。由于已经有很多基于纯文本输出的调试器的代码,DML的目标是为现有的界面提供简单的DML和纯文本的转换。受限制的DML标记使它不能成为外观的关键。一些效果,例如文字颜色能得到很好的支持,除非你删除它们,但别删除包含实际信息的文本。另一方面,由于没有变换纯文本流,不支持格式化文本标记的使用,例如定位功能
- DML不是XML。DML不会传递语义或数据结构信息。正如前面所说的,DML和纯文本之间,只有简单的变换,因此DML标记全部都是可丢弃的。DML不可扩展,所有标记都是由调试器开发团队定义。
DML 支持命令
能够生成 DML 输出中使用以下命令:
- .dml_start
- .dml_flow
- !dml_proc
- lmD
- kM
- .chain /D
- .help 获取 /D
- .printf /D
lmd命令是一个能够提供dml输出的命令示例。lmd命令显示已加载模块的列表。如下图所示,每个模块名称都是一个链接,您可以单击该链接获取有关模块的详细信息。
MSVCR120D模块的详细信息的其他链接。
打开和关闭 DML
当启用 DML 时 ,能够生成 DML 命令输出会默认情况下生成 DML 输出。.prefer_dml命令为能够以调试器标记语言(dml)格式提供输出的命令设置默认行为。
.prefer_dml 0 默认情况下,所有命令都将提供纯文本输出。 .prefer_dml 1 默认情况下,能够提供DML输出的命令将提供DML输出。
执行.prefer_dml 0后
执行.prefer_dml 1后
控制台增强功能
通过重定向 I/O 的调试器,ntsd – d 或 remote.exe 会话不会显示任何颜色。
控制台调试器颜色模式
默认情况下大多数颜色未设置,而是默认为当前控制台颜色。
Windbg 命令浏览器窗口
可以使用浏览器窗口具有一组任意的供使用的有效命令。
自定义的 DML
DML定义了一组可以包含在命令输出中的小标记。一个例子是<link>标记。您可以使用.dml_start和.browse命令来试验<link>标记(和其他dml标记)。.browse.dml_start filepath命令执行存储在dml文件中的命令。输出显示在命令浏览器窗口中,而不是常规命令窗口中。
新建一个文件 c:\DmlExperiment.txt 包含以下行。
My DML Experiment <link cmd="lmDvmMSVCR120D">List modules that begin withMSVCR.</link>
以下命令命令浏览器窗口中显示的文本和链接。
.browse .dml_start c:\Dml_Experiment.txt
如果单击列表的开头 MSVCR 模块链接,请参阅下图类似的输出。
DML中的右键单击行为
从Windows10开始,右键单击行为在DML中可用。此示例演示如何使用<altlink>定义右键单击行为,以发送断点bp(设置断点)命令,并通过常规单击发送u(未组装)。
<link cmd="u ConsoleApplication3!f1"> <altlink name="Set Breakpoint (bp)" cmd="bp MyProgram!memcpy" /> u ConsoleApplication3!f1
</link>
替换到上面的文件里去,执行
单袭连接
右键单击