我们已经了解了什么是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的枚举值组成的标志,说明本文件里包含了哪些信息。

三、流目录

文件头过后紧接着的是流目录。通过文件头里的StreamDirectoryRVA字段决定我们可以快速定位到流目录在文件里的位置。

我们可以看到流目录紧挨着文件头的尾部。
流目录记录内存数据的流的摘要数据组成的数组,方便解析器进行解析和数据定位。数组元素由如下结构填充:

typedef struct _MINIDUMP_DIRECTORY {
ULONG32 StreamType;
MINIDUMP_LOCATION_DESCRIPTOR Location;
} MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
  • StreamType---流类型
    这是一个4字节的MINIDUMP_STREAM_TYPE枚举类型的数据

    typedef enum _MINIDUMP_STREAM_TYPE {
    UnusedStream,
    ReservedStream0,
    ReservedStream1,
    ThreadListStream,
    ModuleListStream,
    MemoryListStream,
    ExceptionStream,
    SystemInfoStream,
    ThreadExListStream,
    Memory64ListStream,
    CommentStreamA,
    CommentStreamW,
    HandleDataStream,
    FunctionTableStream,
    UnloadedModuleListStream,
    MiscInfoStream,
    MemoryInfoListStream,
    ThreadInfoListStream,
    HandleOperationListStream,
    TokenStream,
    JavaScriptDataStream,
    SystemMemoryInfoStream,
    ProcessVmCountersStream,
    IptTraceStream,
    ThreadNamesStream,
    ceStreamNull,
    ceStreamSystemInfo,
    ceStreamException,
    ceStreamModuleList,
    ceStreamProcessList,
    ceStreamThreadList,
    ceStreamThreadContextList,
    ceStreamThreadCallStackList,
    ceStreamMemoryVirtualList,
    ceStreamMemoryPhysicalList,
    ceStreamBucketParameters,
    ceStreamProcessModuleMap,
    ceStreamDiagnosisList,
    LastReservedStream
    } MINIDUMP_STREAM_TYPE;
  • Location---流数据的位置信息
    位置信息也是由一个结构MINIDUMP_LOCATION_DESCRIPTOR来描述的,包含流数据大小和文件偏移地址
    typedef struct _MINIDUMP_LOCATION_DESCRIPTOR {
    ULONG32 DataSize;
    RVA Rva;
    } MINIDUMP_LOCATION_DESCRIPTOR;

通过上面的相关结构,我们可以得出,一个流目录项总供有12个字节,那么有多少个项呢,由文件头里的字段NumberOfStreams给出,比如

我们就可以知道,流目录的大小=sizeof(MINIDUMP_DIRECTORY)*MINIDUMP_HEADER::NumberOfStreams。这个文件里的流目录的大小=12*17=204B

----未完待续

Dump文件数据存储格式(一)的更多相关文章

  1. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  2. gdb调试常用实用命令和core dump文件的生成

      1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxx ...

  3. dump文件定位程序崩溃代码行

    1.dump文件 2.程序对应的pdb 步骤一:安装windbg 步骤二:通过windbg打开crash dump文件 步骤三:设置pdb文件路径,即符号表路径 步骤四:运行命令!analyze -v ...

  4. HBase数据存储格式

    好的数据结构,对于检索数据,插入数据的效率就会很高. 常见的数据结构 B+树 根节点和枝节点非常easy,分别记录每一个叶子节点的最小值,并用一个指针指向叶子节点.  叶子节点里每一个键值都指向真正的 ...

  5. WinDBG 技巧:如何生成Dump 文件(.dump 命令)

    程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并将之Attach 到 ...

  6. WinDbg抓取程序报错dump文件的方法

    程序崩溃的两种主要现象: a. 程序在运行中的时候,突然弹出错误窗口,然后点错误窗口的确定时,程序直接关闭 例如: “应用程序错误” “C++错误之类的窗口” “程序无响应” “假死”等 此种崩溃特点 ...

  7. java OOM还在看log日志,兄弟你错的的很严重,正确方式是分析dump文件

    目录 OOM异常--intsmaze 正确姿势dump文件分析--intsmaze 正确的姿势--intsmaze dump丢失打印--intsmaze 哪些内存溢出会产生dump文件--intsma ...

  8. gdb调试常用实用命令和core dump文件的生成(转)

    1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxxx的 ...

  9. [JAVA]JAVA章3 如何获取及查看DUMP文件

    一.dump基本概念 在故障定位(尤其是out of memory)和性能分析的时候,经常会用到一些文件来帮助我们排除代码问题.这些文件记录了JVM运行期间的内存占用.线程执行等情况,这就是我们常说的 ...

随机推荐

  1. setPos 详解

    etWindowPos 详解   函数名: SetWindowPos 头文件: winuser.h 函数原型: BOOL SetWindowPos ( HWND hWnd, //窗口句柄 HWND h ...

  2. 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

    通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...

  3. Java异常体系结构学习笔记

    异常类的继承层次       1.Throwable是所有异常类的父类,他也继承自Object.所以Throwable是一个类,而不是接口. 2.Error这个分支的异常是由于Java虚拟机内部错误导 ...

  4. (转)Python_如何把Python脚本导出为exe程序

    原文地址:https://www.cnblogs.com/robinunix/p/8426832.html 一.pyinstaller简介 Python是一个脚本语言,被解释器解释执行.它的发布方式: ...

  5. Hibernate的关联映射--一对多、

    这是我 1 单向一对多: 实体类:(课程类)Grade与(学生类)Student的一对多关系 学生类: public class Student implements java.io.Serializ ...

  6. kali之DVWA

    简介 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境, ...

  7. 【开发笔记】- Java写入、读取文本

    文本写入 public static void createFile(String input) throws IOException { //设置文件路径 String filePath = &qu ...

  8. .python3基础之“术语表(1)”

    1.注释: 行首有一特殊标志符号运行时告知编程忽略此行:使代码更易于阅读. 例如: #这是一个注释 print("hello world") #print() 方法用于打印输出,p ...

  9. 如何解决NoSuchMethodError

    背景 工作中写单测,本来用的Mockito,但是为了mock方法里调用的其他静态方法,所以需要使用powermock,于是开始报错. 我把包引入了,然后照着网上的写单测代码,写完了之后运行.噩梦开始. ...

  10. 使用vue-router在页面之间传值及接收值

    第一页 点击去第二页的时候进行传值直接贴代码看: <template> <div id="app"> <div><router-link ...