指定模块和函数所有者
!analyze 和 !owner 扩展使用名为 triage.ini 的文件来确定调试器遇到的符号的所有者。
使用这些扩展时,函数或模块所有者的标识会显示在单词“Followup”后面。
triage.ini 文件是驻留在 Windows 调试工具安装的 \triage 子目录中的文本文件。 示例 triage.ini 文件包含在 Windows 调试工具包中。
警告 如果在当前版本的同一目录中安装更新版本的 Windows 调试工具,它将覆盖该目录中的所有文件,包括 triage.ini。 修改或替换示例 triage.ini 文件后,将其副本保存到其他目录。 重新安装调试器后,可以复制默认版本上保存的 triage.ini。
triage.ini 文件格式
尽管 triage.ini 文件旨在帮助你确定已进入调试器的函数的所有者,但此文件中的“owner”字符串可以是任何可能对调试有帮助的内容。 字符串可以是编写或维护代码的人员的姓名。 或者,字符串可以是有关在模块或函数中发生错误时可以执行的操作的简短说明。
此文件中的每一行都有以下语法。
Module[!Function]=Owner
只能在模块或函数名称的末尾添加星号 (*) 。 如果它出现在其他位置,则将其解释为文本字符。
不能在所有者字符串中添加空格。 如果所有者字符串中确实存在空格,则忽略它们。
有关语法选项的详细信息,请参阅 特殊 triage.ini 语法。
以下示例演示一个示例 triage.ini 文件。
module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7
Triage.ini 和 !owner
将模块或函数名称传递给 !owner 扩展时,调试器将显示单词“Followup”,后跟模块或函数的所有者的名称。
以下示例使用上一个示例 triage.ini 文件。
0:000> !owner module2!functionB
Followup: Person3
根据该文件,“Person3”拥有 module2!functionB,“Person4”拥有 module2!funct\。 这两个字符串都匹配传递给 !owner 的参数,因此使用更完整的匹配。
Triage.ini 和 !analyze
使用 !analyze 扩展时,调试器将查看堆栈中的顶部故障帧,并尝试确定此帧中模块和函数的所有者。 如果调试器可以确定所有者,则会显示所有者信息。
如果调试器无法确定所有者,调试器将传递到下一个堆栈帧,依此推,直到调试器确定所有者或完全检查堆栈为止。
如果调试器可以确定所有者,则会在单词“Followup”后面显示所有者名称。 如果调试器搜索整个堆栈而未找到任何信息,则不会显示任何名称。
以下示例使用本主题前面提供的示例 triage.ini 文件。
假设堆栈上的第一个帧是 MyModule!someFunction。 调试器在 triage.ini 文件中找不到 MyModule 。 接下来,它继续到堆栈上的第二个帧。
假设第二个帧是 module3!anotherFunction。 调试器确实看到 module3 的条目,但此模块中 没有与另一个Function 匹配项。 接下来,调试器继续到第三帧。
假设第三个帧是 module2!functionC。 调试器首先查找完全匹配项,但此类匹配不存在。 然后,调试器会剪裁函数名称,并在 triage.ini 中发现 module2!funct\*。 此匹配将结束搜索,因为调试器确定所有者为“Person4”。
然后,调试器会显示类似于以下示例的输出。
0:000> !analyze
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
Probably caused by : module2 ( module2!functionC+15a )
Followup: Person4
---------
更完整的匹配优先于较短的匹配。 但是,模块名称匹配始终优先于函数名称匹配。 如果 module2!funct\* 未在此 triage.ini 文件中,则调试器会选择 module2!\* 作为匹配项。 如果同时删除 module2!funct\* 和 module2!\* ,则会选择 mod*!functionC 。
特殊 triage.ini 语法
如果省略感叹号和函数名称或在模块名称后添加 !\*,则会指示该模块中的所有函数。 如果此模块中的函数也单独指定,则更精确的规范优先。
如果使用“default”作为模块名称或函数名称,则它等效于通配符。 例如, nt!\* 与 nt!default 相同, 默认值 与 *!\*相同。
如果进行了匹配,但“ 忽略” 一词出现在等号 (=) 右侧,则调试器将继续转到堆栈中的下一帧。
可以在所有者姓名之前添加 last_ 或 maybe_ 。 运行 !analyze 时,此前缀会降低所有者的优先级。 调试器选择堆栈上较低的明确匹配项,而选择堆栈上较高的 maybe_ 匹配项。 调试器还会选择堆栈上较低的 maybe_ 匹配项,而选择堆栈上较高的 last_ 匹配项。
示例 triage.ini
适用于 Windows 的调试工具包中包含示例 triage.ini 模板。 可以将所需的任何模块和函数的所有者添加到此文件。 如果希望没有全局默认值,请删除此文件开头的 default=MachineOwner 行。