通过使用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. JavaScript------获取url地址中的参数

    $(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...

  2. Nike Zoom Winflo 2 Kvinder Sko Når jeg set elementet

    De fleste af os elskede denne Nike Pegasus 34 foruden var ved at blive begejstret for at få dine ben ...

  3. 获取URL中的参数

    function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...

  4. 页面测试点testpoint

    页面测试点整理(非逻辑测试点) 由于自己一年来一直在做页面测试,也看了很多测试理论的书和方法,但是方法并非也无法照搬,此处总结自己工作以来通过各种坑摸出来的一些方法点,希望一边靠上经典测试理论,一边形 ...

  5. redis消息队列简单应用

    消息队列出现的原因 随着互联网的高速发展,门户网站.视频直播.电商领域等web应用中,高并发.大数据已经成为基本的标识.淘宝双11.京东618.各种抢购.秒杀活动.以及12306的春运抢票等,他们这些 ...

  6. SQL批量更新 关系表更新

    很多人在做数据的批量更新时..如果更新的内容是从其他表查出来的..很容易这么写.. UPDATE TABLE1 SET COLUMN1=(SELECT SUM(SOMETHING) FROM TABL ...

  7. Linux基础知识整理

    一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...

  8. ump_player在线直播播放器

      ump_player在线直播播放器封装,可以支持加载在线直播流 https://github.com/Mrxdh/EveryExercise/blob/master/ump_player%E5%9 ...

  9. 报错com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0

    看着错误信息应该是从高版本换成低版本报的错误,然而我的JDK并没有变动.会像昨天走之前干了什么? 自己在AndroidStudio上倒弄自己的小项目,更新了build tools到24了 删除24,e ...

  10. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...