通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃

系列文章目录

C++程序异常调查专栏


文章目录

  • 系列文章目录
  • 前言
  • 一、GFlags是什么?
  • 二、如何获取GFlags
  • 三、使用步骤
    • 1.确认GFlags是否已经安装
    • 2.以管理员权限启动Command prompt
    • 3.GFlags有效设定
    • 4.检查GFlags有效设定是否成功
      • 4.1 通过命令查看已经设定GFlags有效的程序
      • 4.2 通过注册表查看已经设定GFlags有效的程序
    • 5.复现程序崩溃
    • 6.GFlags无效设定


前言

客户PC上如果发生程序崩溃,在现有条件后调查无果,又不能复现的情况下,再推进调查会变得很困难。即使通过分析代码能够推测到原因,但因为不能复现也没办法去验证。如果通过客户的环境去验证,成功则好,不成功的话,加大沟通成本同时也降低了客户的信任度。

这时候最好的办法还是先想办法去复现该程序崩溃。针对野指针、内存越界等造成的程序崩溃,利用GFlags工具能够显著的提高复现的几率。


一、GFlags是什么?

GFlags 是全局标志编辑器,用于启用和禁用高级调试、诊断和故障排除功能。驱动程序开发人员和测试人员通常使用 GFlags 直接或通过在测试脚本中包含 GFlags 命令来启用调试、日志记录和测试功能。页堆验证功能可帮助你识别 内核模式 驱动程序中的内存泄漏和缓冲区错误。

GFlags 具有对话框和命令行接口。 这两个接口提供大多数功能,但某些功能只能从其中一个接口访问。

二、如何获取GFlags

GFlags.exe 包含在WinDbg调试工具中。

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

三、使用步骤

1.确认GFlags是否已经安装

进入安装目录去确认

2.以管理员权限启动Command prompt

以管理员权限启动Command prompt启动后,移动到GFlags的安装目录
C:\Program Files (x86)\Windows Kits\10\Debuggers\x86>
在这里插入图片描述

3.GFlags有效设定

输入以下命令设置程序的GFlags有效,如果要设置多个程序,依次输入以下命令即可。

gflags.exe /p /enable aa.exe /full

命令运行后,以下消息则表示该程序的GFlags设定成功

aa.exe: page heap enabled

通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃_第1张图片

4.检查GFlags有效设定是否成功

4.1 通过命令查看已经设定GFlags有效的程序

输入以下命令查看程序的GFlags是否有效

 gflags.exe /p

命令运行后,查看设定成功的程序是否和预期一致
通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃_第2张图片

4.2 通过注册表查看已经设定GFlags有效的程序

注册表地址

32位操作系统
SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

64位操作系统
SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

上述地址展开后找到指定程序,在右侧查看其值的内容
设定有效
设定有效状态
设定无效
设定无效状态

5.复现程序崩溃

在GFlags设定有效的状态下,按照客户提供的复现步骤,再尝试复现程序的崩溃。复现后,再结合其他方法去定位问题。

6.GFlags无效设定

问题调查完后,把相应的GFlags设定无效,回到调查的状态。
输入以下命令设置程序的GFlags无效,如果要设置多个程序,依次输入以下命令即可。

gflags.exe /p /disable aa.exe

命令运行后,以下消息则表示该程序的GFlags无效设定成功

aa.exe: page heap disabled

通过GFlags工具来复现因为野指针、内存越界等造成的程序崩溃_第3张图片


你可能感兴趣的:(c++)