客户PC上如果发生程序崩溃,在现有条件后调查无果,又不能复现的情况下,再推进调查会变得很困难。即使通过分析代码能够推测到原因,但因为不能复现也没办法去验证。如果通过客户的环境去验证,成功则好,不成功的话,加大沟通成本同时也降低了客户的信任度。
这时候最好的办法还是先想办法去复现该程序崩溃。针对野指针、内存越界等造成的程序崩溃,利用GFlags工具能够显著的提高复现的几率。
GFlags 是全局标志编辑器,用于启用和禁用高级调试、诊断和故障排除功能。驱动程序开发人员和测试人员通常使用 GFlags 直接或通过在测试脚本中包含 GFlags 命令来启用调试、日志记录和测试功能。页堆验证功能可帮助你识别 内核模式 驱动程序中的内存泄漏和缓冲区错误。
GFlags 具有对话框和命令行接口。 这两个接口提供大多数功能,但某些功能只能从其中一个接口访问。
GFlags.exe 包含在WinDbg调试工具中。
安装WinDbg调试工具后,默认在以下目录中安装 64 位版本的 gflags.exe 。
C:\Program Files(x86)\Windows Kits\10\Debuggers\x64
如果运行的是 32 位版本的 Windows,请使用位于此处的 32 位版本的 gflags.exe :
C:\Program Files(x86)\Windows Kits\10\Debuggers\x86
进入安装目录去确认
以管理员权限启动Command prompt启动后,移动到GFlags的安装目录
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86>
输入以下命令设置程序的GFlags有效,如果要设置多个程序,依次输入以下命令即可。
gflags.exe /p /enable aa.exe /full
命令运行后,以下消息则表示该程序的GFlags设定成功
aa.exe: page heap enabled
输入以下命令查看程序的GFlags是否有效
gflags.exe /p
命令运行后,查看设定成功的程序是否和预期一致
注册表地址
32位操作系统
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
64位操作系统
SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
上述地址展开后找到指定程序,在右侧查看其值的内容
设定有效
设定无效
在GFlags设定有效的状态下,按照客户提供的复现步骤,再尝试复现程序的崩溃。复现后,再结合其他方法去定位问题。
问题调查完后,把相应的GFlags设定无效,回到调查的状态。
输入以下命令设置程序的GFlags无效,如果要设置多个程序,依次输入以下命令即可。
gflags.exe /p /disable aa.exe
命令运行后,以下消息则表示该程序的GFlags无效设定成功
aa.exe: page heap disabled