通过使用windbg提供DbgHelp库中的MiniDumpWriteDump函数在程序崩溃时写dump文件记录程序当时状态,为后续分析问题提供现场。

该函数提供了DumpType参数,让程序员根据具体情况来生成包含不同详细程度内容的dump文件。

例如:QQ崩溃后,会询问玩家是否要发送崩溃到服务器,以帮助开发解决该问题,这个时候创建的dump就不宜过大。

typedef enum _MINIDUMP_TYPE {
MiniDumpNormal = 0x00000000,
MiniDumpWithDataSegs = 0x00000001,
MiniDumpWithFullMemory = 0x00000002,
MiniDumpWithHandleData = 0x00000004,
MiniDumpFilterMemory = 0x00000008,
MiniDumpScanMemory = 0x00000010,
MiniDumpWithUnloadedModules = 0x00000020,
MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
MiniDumpFilterModulePaths = 0x00000080,
MiniDumpWithProcessThreadData = 0x00000100,
MiniDumpWithPrivateReadWriteMemory = 0x00000200,
MiniDumpWithoutOptionalData = 0x00000400,
MiniDumpWithFullMemoryInfo = 0x00000800,
MiniDumpWithThreadInfo = 0x00001000,
MiniDumpWithCodeSegs = 0x00002000,
MiniDumpWithoutManagedState = 0x00004000,
} MINIDUMP_TYPE;

这些枚举可以组合,以生成包含自己想要的dump文件。

如:DUMP_TYPE_MINI = MiniDumpWithUnloadedModules

如:DUMP_TYPE_MIDD = MiniDumpWithUnloadedModules | MiniDumpWithIndirectlyReferencedMemory

如:DUMP_TYPE_FULL = MiniDumpNormal | MiniDumpWithFullMemory | MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData

组合的枚举越多,生成出来的dump文件信息就越丰富。下面依次对各个枚举的dump包含的信息进行说明:

MiniDumpNormal  -- 包含最基础的数据  缺省

数据类型 说明 命令
系统信息

发生崩溃机器的os版本号

cpu个数与型号

vertarget

!cpuid

进程信息

进程ID

进程创建时间、执行用户态代码与内核态代码的时间

|

.time

模块信息

每一个被进程加载的模块,信息包括:加载地址、大小、文件名(包含路径)、版本、

模块元信息(checksum, timestamp, debug information record; -- 用于调试器匹配与加载该模块的调试信息)

lm
线程信息 当前跑的每一个线程,信息包括:线程ID、优先级、线程上下文、暂停次数、TEB地址(不包括TEB具体内容) ~
线程栈 所有线程的完整stack内容(stack中存放着:函数调用堆栈、局部变量、参数变量)  
IP信息 存储每个线程IP寄存器所指向地址周围的256个字节的内存,使得在没有可执行模块情况下也能查看崩溃点周围的汇编指令  
异常信息

通过MiniDumpWriteDump第5个参数传入的

内容包括:EXCEPTION_RECORD结构体数据、当前异常线程上下文、当前异常线程的IP信息

.ecxr

(1) 通过查看各个线程的函数调用堆栈来看它们在等待什么,来确认程序是否发生了死锁

(2) 可查看各个线程函数栈帧的局部变量以及参数变量的值,不能查看全局变量及malloc、new出来的堆内存中的内容

(3) Dump文件大小主要取决于线程栈的大小,一般小于20KB

MiniDumpWithFullMemory  -- 包含所有数据

(1) 包含进程地址空间内所有可读页的内容

(2) 可查看各个模块、线程环境块(PEB)、进程环境块(TEB)在栈或堆上的值

(3) 包含各个模块代码段的页(冗余  如果有各个模块可执行文件的话,windbg能从这些文件中获取到)

(4) 可查看各个模块数据段内容(全局变量)

(5) Dump文件很大,与进程占用的物理内存工作集(Working Set)大小相当

MiniDumpWithPrivateReadWriteMemory

(1) 包括进程地址空间内所有可读可写的私有内存页(物理内存私有工作集Working Set Private,即主模块exe的内存页)

(2) 可查看主模块exe、线程局部存储(TLS)、线程环境块(PEB)、进程环境块(TEB)在栈或堆上的值

(3) 不能查看共享模块及内存映射文件中的内容

(4) 不包括各个模块的代码段

(5) 不能查看各个模块的数据段(全局变量)

MiniDumpWithIndirectlyReferencedMemory

(1) 扫描各个线程栈中的指向可读内存页的指针(由于MiniDumpWriteDump在扫描时无法访问调试信息,无法区分指针与整型变量,因此整型变量也会被当做指针处理),

将指针指向的内存地址前256B+后768B的内容(共1KB)保存到Dump文件中

(2) 不包括指向数据段的指针(无法查看全局变量的值)

MiniDumpWithDataSegs

(1) 包含各个模块所有可写数据段, 可查看数据段内容(非常量的全局变量)

(2) Dump文件较大,哪怕只使用了dll的一个函数,该dll的所有可写数据段都会被写入Dump

MiniDumpWithCodeSegs

(1) 包含各个已加载模块代码段(使得windbg中不用配置Image Path)

MiniDumpWithHandleData

(1) 发生崩溃时,将进程句柄表中所有句柄信息写入Dump中

(2) windbg中通过!handle命令来查看句柄

MiniDumpWithThreadInfo

(1)  各个线程的额外信息:时间(创建时间、分别执行用户和内核代码的时间)、线程函数地址(Start Address)、

关联性(Affinity -- 在那些cpu上运行当前线程,若TheadAffinity为fd,表示可以在0、2-7编号的cpu上运行;TheadAffinity的值首先会受到进程的Affinity的限制)

(2)  .ttime查看当前线程的时间信息,~.查看当前线程的线程函数地址及关联性

!runaway查看所有线程的时间信息,~*查看所有线程的线程函数地址及关联性

MiniDumpWithProcessThreadData

(1) 包含线程环境块(PEB)、进程环境块(TEB)的内存页

(2) PEB及TEB引用的内存页(如:环境变量、进程参数、通过TlsAlloc分配的位标志所在的内存页)

(3) 不包括TLS数据(线程局部变量,可通过__declspec(thread)关键字来定义)

MiniDumpWithFullMemoryInfo

(1) 进程的整个虚拟内存布局信息(各个内存页的基址、大小、状态和类型)

(2) .vadump查看进程的整个虚拟内存布局

MiniDumpWithoutOptionalData  -- 只包含MiniDumpNormal的数据  如:MiniDumpWithFullMemory | MiniDumpWithoutOptionalData等价于MiniDumpNormal

MiniDumpFilterMemory  -- 线程栈结构完好,但会将栈上的数据(如局部变量、参数变量)设置成0,堆内存不受影响;另外对MiniDumpWithFullMemory不起作用

MiniDumpFilterModulePaths  -- 去除模块路径,只保留模块名称

MiniDumpScanMemory  -- 从Dump文件中排除某些模块(通过MiniDumpCallback函数),以减少Dump文件的大小

----------------------------------------------------------------------------------------------------
MiniDumpCallback可以实现如下用户自定义行为:
① 整个或部分排除某个模块的信息
② 整个或部分排除某个线程的信息
③ 加入用户指定内存内容到Dump中
----------------------------------------------------------------------------------------------------

MiniDumpWithUnloadedModules  -- 包含未加载模块信息(windows server 2003 sp1, windows xp sp2及以上系统能获取到这块信息)

参考:

EFFECTIVE MINIDUMPS (PART 1)

EFFECTIVE MINIDUMPS (PART 2)

MINIDUMP EXAMPLES

Dump类型说明的更多相关文章

  1. 调试SQLSERVER (一)生成dump文件的方法

    调试SQLSERVER (一)生成dump文件的方法 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  2. windows下捕获dump之Google breakpad_client的理解

    breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...

  3. windows下捕获dump之Google breakpad_client

    breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...

  4. 抓取Dump文件的方法和工具介绍

    一.Windows系统的任务管理器里抓dump 启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件" 注意事项: 当你在64位Windows系统上抓32位进程的dmup文件 ...

  5. Dump文件的生成

    一.Windows系统的任务管理器里抓dump 启动任务管理器,选中某个进程,右键,弹出菜单"创建转储文件" 注意事项: 当你在64位Windows系统上抓32位进程的dmup文件 ...

  6. Xdebug文档(三)堆栈跟踪

    当xdebug激活时,PHP一旦要显示通知.警告或错误时,xdebug 显示堆栈跟踪信息.这个堆栈信息能跟据你的需要来配置显示. Xdebug显示的堆栈跟踪都是以保守数量状态显示信息.因为大量的信息处 ...

  7. C++库(Google Breakpad)

    Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...

  8. PHP debug 环境配置

    在建立PHP开发调试环境时,经常会遇到xdebug无法成功安装的问题,其实主要原因有两点: 1. xdebug版本和php版本不匹配 2.xdebug和 zend不能同时运行,需要在php.ini中禁 ...

  9. breakpad是Google开源的一套跨平台工具

    windows下捕获dump之Google breakpad_client的理解   breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及break ...

随机推荐

  1. jQuery 下拉框应用 拓展

    jquery 书本上的一个例子 书本上只写了从左边添加到右边,无非就是remove() 方法和 appendTo() 方法. 然而,我试过了,并不能像从左边添加到右边那样简单的把右边的删除到左边过来. ...

  2. Html中的文本框和单选按钮

    Html中的文本框和单选按钮用来制作页面的登录注册使用.. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...

  3. 基于fastweixin的微信开发环境搭建(一)

    由于公司业务需要,开发微信版本,才开始接触微信公众平台.在github折腾了几天,试过好几个微信sdk,最终选择fastweixin.个人觉得这个框架还是值得使用的,使用也简单.那么问题来了,很多人想 ...

  4. split分割大文件--包含通过awk按规则分割文件到对应子文件

    当对一个大文件进行传输或者分析的时候,一个可以参考的办法是先通过split对文件进行分割,再对每个子文件进行处理,如果需要合并再进行合并. split函数可以按文件大小或者行数来进行分割. -a :  ...

  5. 抓取百万知乎用户信息之HttpHelper的迭代之路

    什么是Httphelper? httpelpers是一个封装好拿来获取网络上资源的工具类.因为是用http协议,故取名httphelper. httphelper出现的背景 使用WebClient可以 ...

  6. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    文章主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用. 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...

  7. Redis实战阅读笔记——开始

    Redis实战这本书,看完以后最大的不是redis本身的东西,而是作者面对实际问题的分析而给出的设计方案,可以看成NoSql设计的应用.个人从这方面收获很多,至于Redis本身的东西,这个就花一两个小 ...

  8. 关于形变属CGAffineTransform性介绍

    CGAffineTransformMakeTranslation每次都是以最初位置的中心点为起始参照 CGAffineTransformTranslate每次都是以传入的transform为起始参照, ...

  9. IE浏览器下异步请求的缓存问题

    问题: 在做即时通讯时,需要提示用户有几条未读的提醒,这个是(如果有新的提示消息立马在浏览器无刷新提示)即时获取的.但我们的做法是,当用户点击未读信息进入到信息显示页面时重新获取下未读的提醒:但是在I ...

  10. WebForm 分页、组合查询--2017年1月5日

    sql = "select * from Commodity"; hs = new Hashtable(); if (txt_name.Text.Trim() != "& ...