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链接。 输出包括使您能够进一步浏览MSVCR120D模块的详细信息的其他链接。
打开和关闭 DML
.Prefer_dml 命令会启用 DML,打开或关闭。 当启用 DML 时 ,能够生成 DML 命令输出会默认情况下生成 DML 输出。.prefer_dml命令为能够以调试器标记语言(dml)格式提供输出的命令设置默认行为。
.prefer_dml 0 默认情况下,所有命令都将提供纯文本输出。 .prefer_dml 1 默认情况下,能够提供DML输出的命令将提供DML输出。
执行.prefer_dml 0后
执行.prefer_dml 1后
控制台增强功能
所有 Windows 调试器现支持 DML 分析命令输出区域。 在 windbg 中命令窗口支持所有 DML 行为,并将显示颜色、 字体样式和链接。 使用颜色模式已启用,则返回 true 的控制台中运行时,控制台调试器,ntsd、 cdb 和 kd,仅支持 DML,和唯一的颜色属性。 通过重定向 I/O 的调试器,ntsd – d 或 remote.exe 会话不会显示任何颜色。
控制台调试器颜色模式
控制台调试器、 ntsd、 cdb 和 kd 现显示彩色的输出时,则返回 true 的控制台中运行的能力。 这不是默认值,它需要显式启用通过 tools.ini 颜色模式。 新 col_模式下<true | false>中 tools.ini 令牌控制颜色模式设置。启用颜色模式调试器可以生成彩色的输出。 默认情况下大多数颜色未设置,而是默认为当前控制台颜色。
Windbg 命令浏览器窗口
在 Windows 10 和更高版本的 Windbg 命令浏览器窗口分析并显示 DML。 所有标记,如<链接>, <exec>外观修改系统完全支持。若要开始使用 WinDbg 中的菜单命令浏览器会话,请选择视图,命令浏览器。 .Browse<命令>在命令窗口将打开一个新的命令浏览器窗口并执行给定的命令。 此外可以使用 Ctrl + N 打开一个新的命令浏览器窗口。命令浏览器窗口谨慎地模拟 web 浏览器中,使用下拉列表历史记录和上一个/下一个按钮的行为。 历史记录下拉列表仅显示最后二十个命令,但完整历史记录仍保留,以便您可以通过在命令获取下拉列表以显示较旧的历史记录。您可以根据需要同时打开的任意多个命令窗口。 命令窗口保留在工作区中,但仅将保存当前的命令;不放置在历史记录。WinDbg视图菜单还拥有设置浏览器启动命令选项,这样用户就可以开始时,设置新的浏览器窗口的首选的命令,例如.dml_开始。 此命令保存在工作区中。一个新的命令子窗口位于视图菜单来保存感兴趣的命令。 选择新的命令将新的浏览器打开与给定命令。 将窗口的当前命令添加到新的命令的列表的浏览器窗口的上下文菜单上没有菜单项。 在工作区中保留的最新命令的列表。命令浏览器窗口以同步方式执行该命令,因此不会显示输出直到完成该命令。 长时间运行的命令不会显示任何内容之前已完成。链接具有类似于右键单击上下文菜单右键单击上下文菜单在 web 浏览器中。 可以在新的浏览器窗口中打开链接。 链接的命令可以复制到剪贴板,以便使用。单击要设置为自动刷新或手动刷新命令浏览器窗口的标题栏右上角附近的图标。 自动刷新浏览器将自动重新运行其命令在调试器状态更改。 这会使输出实时但代价是会执行该命令上的所有更改。 自动刷新在默认情况下处于打开状态。 如果不需要处于活动状态,在浏览器窗口的上下文菜单可用于禁用自动刷新。由于命令执行引擎,不通过用户界面,用户界面特定的命令,如 .cls (清除屏幕),命令浏览器中使用时,将返回中的语法错误windows。 它还意味着,当用户界面是远程客户端、 服务器不是由客户端,将执行命令和命令输出会显示服务器状态。命令的浏览器窗口可以运行任何调试器命令,它不一定要生成 DML 命令。 可以使用浏览器窗口具有一组任意的供使用的有效命令。
自定义的 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中的右键单击行为
<link cmd="u ConsoleApplication3!f1"> <altlink name="Set Breakpoint (bp)" cmd="bp MyProgram!memcpy" /> u ConsoleApplication3!f1
</link>
替换到上面的文件里去,执行
单袭连接
右键单击