dump ——相关资料(转发)

原文:

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

认识Dump文件

Dump文件数据存储格式(一)

Dump文件的校验查看工具

分析一个dump的一般步骤

又又一款抓dmp工具---ProcDump

 

 

一、什么是Dump文件

又叫内存转储文件或者叫内存快照文件。是一个进程或系统在某一给定的时间的快照。比如在进程崩溃时或则进程有其他问题时,甚至是任何时候,我们都可以通过工具将系统或某进程的内存备份出来供调试分析用。dump文件中包含了程序运行的模块信息、线程信息、堆栈调用信息、异常信息等数据。

 

二、分类

Windows下Dump文件分为两大类:内核模式Dump和用户模式Dump

 

2.1、内核模式Dump

是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump。如果你抓取整个系统的内存dump文件, 那么你抓取的是内核态的dump文件.

2.2、用户模式Dump

如果你抓一个进程的dump文件, 那么你抓取的是用户态的dump文件。进一步可以分为完整Dump(Full Dump)和迷你Dump(Minidump)。

    • Full Dump
      包含了某个进程完整的地址空间数据,以及许多用于调试的信息
    • Minidump
      随着Windows XP,微软发布了一组新的被称为“minidump”的崩溃转存技术。Minidump很容易定制。按照最常用的配置,一个minidump只包括了最必要的信息,用于恢复故障进程的所有线程的调用堆栈,以及查看故障时刻局部变量的值。这样的dump文件通常很小(只有几K字节)。所以,很容易通过电子方式发送给软件开发人员。一旦需要,minidump甚至可以包含比原来的crash dump更多的信息。minidump可以定制,给我们带来了一个问题-保存多少应用程序状态信息才能既保证调试有效,又能够尽量保证minidump文件尽可能小?尽管调试简单的异常访问只需要调用堆栈和局部变量的信息,但是解决更复杂的问题需要更多的信息。例如,我们可能需要查看全局变量的值、检查堆的完整性和分析进程虚拟内存的布局。同时,可执行程序的代码段往往是多余的,开发用的机器上可以很容易找到这些执行程序。

 

三、Dump文件的使用场景

场景一:对我们程序员来说,当我们的应用程序发布出去,在客户机上线出了问题(崩溃、失去响应、资源消耗过高,性能不理想),由于这些问题不是发生在开发环境下的,这时我们就需要在客户机上想办法抓取dmp文件,拿回来进行分析。总之,Dump文件对我们编程人员,特别是Windows系统上进行C++开发应用的开发人员,进行问题定位非常有帮助。

场景二:windows系统自己出了问题,比如蓝屏了,这时系统会自动产生dump文件,被微软收集分析

 

一、总体结构

 

二、文件头

首先文件的最开始的32个字节是Dump文件的文件头,这里包含了Dump文件标识、格式版本、校验和、时间戳和一些标志,

typedef struct _MINIDUMP_HEADER {

  ULONG32 Signature;
  ULONG32 Version;
  ULONG32 NumberOfStreams;
  RVA     StreamDirectoryRva;
  ULONG32 CheckSum;
  union {
    ULONG32 Reserved;
    ULONG32 TimeDateStamp;
  };
  ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER

上面的结构包含了很多信息,总共32个字节,存放在文件的最开始的位置,下面分别说下各成员:

    • Signature---文件标识
      4个字节,存放内容是"MDMP"字符串的ASSIC码。可以简单的读取文件的头4个字节是否等于"MDMP"来判断一个文件是否是Dump文件。
    • Version---Dump格式的版本
      低两字节是MiniDump的版本号,高两字节是一个特定整形值
    • NumberofStreams----文件里内存数据流的计数
      也就是MiniDump目录表的元素个数。dump文件是以流的形式保存内存数据,各个流的类型不一样。
    • StreamDirectoryRVA
      流目录表的文件偏移地址,从文件最开始处也就是地址0开始,那么要寻址流目录:0+StreamDirectoryRva(字节)
    • CheckSum
      文件校验和,可以为0
    • TimeDataStamp
      时间戳,文件的修改时间
    • Flags
      一个或多个MINIDUMP_TYPE的枚举值组成的标志,说明本文件里包含了哪些信息。

 

 

 

当我们抓取到Dump文件后,我们抓取的方式对不对,是否包含了我们想要的信息,可不可用,又或这个文件在抓取或传输过程种,有没有损坏,又或者我不想用Windbg进行细致的分析,只想大概了解下异常信息,在这样的需求下,有没有工具帮我们快速浏览Dump文件信息呢,有,今天给大家介绍两款工具。

一、DumpChk.exe

DumpChk是Microsoft 崩溃转储文件检查器工具, 是一个可执行的崩溃转储文件的快速分析程序。可以查看有关转储文件包含摘要信息。 如果转储文件已损坏,无法由调试器打开时,dumpchk 将会告诉我们。当大家安装了Debugging Tools for Windows工具集后,就会有这个程序了。

二、MinidumpExplorer

这个一款图形界面的Dump文件浏览器

 

 

  1. 看清楚是何种异常导致的崩溃.
  2. 对齐symbol, 找到发生崩溃的函数名字, 以及对应的汇编代码和源代码.
  3. 列出callstack
  4. 检查callstack是否合理
  5. 检查发生崩溃的函数是否得到了正确的参数.
  6. 检查发生崩溃的函数使用的数据是否正确.
  7. 结合上面的信息, 构思来龙去脉, 然后用资料来证明, 或者反驳自己的猜想.
  8. 通过进一步的操作来获取更有意义的资料. 比如激活pageheap后, 重新抓取dump, 或者干脆进行Live debug

 

ProcDump是一个命令行实用程序,其主要目的是监视应用程序的CPU峰值,并在峰值期间生成崩溃转储,管理员或开发人员可以使用该转储来确定峰值的原因。ProcDump还包括挂起窗口监视(使用与Windows和任务管理器使用的相同的窗口挂起定义)、未处理的异常监视,并且可以基于系统性能计数器的值生成转储。它还可以作为一个通用的进程转储实用程序,可以嵌入到其他脚本中。

 

 

 

 

posted @ 2021-01-11 19:23  PanPan003  阅读(728)  评论(0编辑  收藏  举报