WinDbg 帮助文档翻译11
配置调试器
本节包含以下内容:
使用日志文件
指定模块和函数所有者
控制异常和事件
设置路径和加载文件
使用日志文件
调试器可以为调试会话记录日志文件。这些日志包括调试器命令窗口中所有内容,包含输入的命令和调试器的输出。
在WinDbg中,一些菜单和工具栏操作会在调试器命令窗口显示一些信息。日志文件不会记录这些文本。
打开新的日志文件
用下面的方法之一来打开新的日志文件或覆盖掉旧的日志文件:
?(仅针对CDB 和KD) 启动调试器之前,设置_NT_DEBUG_LOG_FILE_OPEN 环境变量。
?启动调试器时,使用-logo 命令行选项。
?使用.logopen (Open Log File) 命令。如果指定了/t选项,则会在指定的文件名后面加上日期和时间。如果指定/u选项,日志文件会用Unicode记录而不是ASCII。
?(仅WinDbg)使用Edit | Open/Close Log File 菜单命令。
添加到已存在的日志文件中
使用下面的方法之一来将命令窗口文本添加到日志文件末尾:
?(仅CDB 和KD) 启动调试器之前,设置_NT_DEBUG_LOG_FILE_APPEND 环境变量。
?启动调试器时,使用-loga 命令行选项。
?使用.logappend (Append Log File) 命令。如果添加到Unicode日志文件,必须使用/u选项。
?(仅WinDbg) 使用 Edit | Open/Close Log File 菜单命令,然后选择Append。
关闭日志文件
使用下面方法之一来关闭打开的日志文件:
?使用.logclose (Close Log File)命令。
?(仅WinDbg) 使用 Edit | Open/Close Log File 菜单命令,并选择Close Open Log File。
检查日志文件状态
用下面的方法之一检查日志文件状态:
?使用.logfile (Display Log File Status)命令。
?(仅WinDbg) 打开 Edit | Open/Close Log File 菜单并查看是否日志文件被列出。
指定模块和函数所有者
!analyze 和!owner 扩展命令使用名为Triage.ini的文件来决定调试器遇到的符号的所有者。
使用这些扩展命令时,函数或模块的标识会显示在”Followup”之后。
Triage.ini 是在Windows调试工具包安装目录下的\triage 子目录中的一个文本文件。Windows调试工具包中有一个Triage.ini文件的示例。
警告 如果在已有的Windows调试工具包目录下升级新版本,会将目录下的所有文件覆盖掉,包括Triage.ini 。修改或替换掉Triage.ini 文件之后,最好将它保存一份拷贝到其他目录中。重新安装调试器后,就可以使用备份的Triage.ini来覆盖默认的。
Triage.ini 文件的格式
虽然Triage.ini文件用于帮助确定中断到调试器中的函数的所有者,文件中的 “owner” 字符串却可以是对调试有益的任何值。该字符串可以是编写或维护代码的人的名字,或者当某个模块或函数出错时的简短的操作流程说明。
文件中每一行都具有下面的语法。
Module[!Function]=Owner
可以在模块或函数名的末尾添加一个星号(*)作为通配符。
所有者字符串中不能加入空格。If strings do exist in the owner string, they are ignored。(不明白……)
关于该语法的更多信息,查看 特殊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扩展命令时,调试器在堆栈中查找顶层的异常帧(top faulting frame),并尝试确定该帧的模块和函数的所有者。如果找到,则会显示所有者信息。
如果调试器没有找到所有者,则会继续根据下面的堆栈帧来查找,直到调试器找到所有者或所有的堆栈都被检查过了。
如果找到了所有者,则在”Followup”后显示他的名字。如果调试器搜索了整个堆栈也没有找到任何信息,则不会显示名字。
下面的示例使用了上面例子中的Triage.ini。
假设第一个堆栈帧是MyModule!someFunction 。调试器在Triage.ini 文件中没有找到MyModule。然后,它会继续查找堆栈中的第二帧。
假设第二帧是module3!anotherFunction。调试器找到了一条关于module3的信息,但是该模块中没有和anotherFunction匹配的信息。所以调试器继续查找第三帧。
假设第三帧是module2!functionC 。调试器首先查找能精确匹配的信息但是未找到。所以会截掉函数名并在Triage.ini 中找到了module2!funct*。这个匹配结束搜索,因为调试器确认了所有者是”Person4″。
调试器会显示类似下面的输出。
0:000> !analyze
*******************************************************************************
* *
* Exception Analysis