zoukankan      html  css  js  c++  java
  • Dump类型说明

    通过使用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

  • 相关阅读:
    oracle的nvl和sql server的isnull
    Distinct和Group by去除重复字段记录
    shell(2):正则表达式
    一把年纪时,我决定学习区块链
    到这个年纪为什么我还要开始学习理解参与区块链?
    孤荷凌寒自学python第八十六天对selenium模块进行较详细的了解
    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1
    孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块
    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境
    孤荷凌寒自学python第八十二天学习爬取图片2
  • 原文地址:https://www.cnblogs.com/kekec/p/5052793.html
Copyright © 2011-2022 走看看