前几天调试一个崩溃,截到一个full dump文件,显示一个视频帧数据转换有问题。从调用栈可以看到完整的帧数据。

然后我就想把这个数据保存下来,再构造崩溃场景,VS没有提供把内存dump为文件的功能。google一下,好像有一个第三方工具叫dumper, 感觉用起来有点复杂。

偶然想到调试dump时看到的内存块应该是在dump文件里,而且应该是连续的。用emeditor的二进制模式打开dump文件,搜索调试显示的内存值,果然顺利找到。

既然在dump文件里,那么只需要到到偏移地址,再从dump文件里顺序截取出需要的数据就好了。

下面是我随手写的一个小工具的代码:

 1 // binext.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <stdlib.h>
6
7 #define min(a,b) a<b?a:b
8
9 int main(int argc, char* argv[])
10 {
11 if(argc != 5)
12 {
13 printf("usage: binext inputfile offset length outputfile\n");
14 return 0;
15 }
16
17 const char * input = argv[1];
18 long nOffset = atol(argv[2]);
19 long nLength = atol(argv[3]);
20 const char * output = argv[4];
21 FILE *f = fopen(input,"rb");
22 FILE *fout = fopen(output,"wb");
23 if(f && fout)
24 {
25 fseek(f,nOffset,SEEK_SET);
26 char buf[1024];
27 int nLeft = nLength;
28 while(nLeft>0)
29 {
30 int nSeg = min(1024,nLeft);
31 fread(buf,1,nSeg,f);
32 fwrite(buf,1,nSeg,fout);
33 nLeft -= nSeg;
34 }
35 printf("extract buffer length %d at offset %d from %s succeed!",nLength,nOffset,input);
36 }
37 if(f) fclose(f);
38 if(fout) fclose(fout);
39 return 0;
40 }

vs 2008编译通过。这里只是简单的测试,没有做异常处理。

一种把dump里连续的内存保存到文件的方法的更多相关文章

  1. Dump Lsass内存转储新旧方法

      之前看到一篇关于Lsass内存dump的文章,学习记录一下.   lsass.exe(Local Security Authority Subsystem Service)进程空间中,存有着机器的 ...

  2. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...

  3. C++中内存泄漏的检测方法介绍

    C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...

  4. MATLAB学习之内存溢出的管理方法

    今天用Matlab跑程序,由于数据量太大,又出现 Out of memory. Type HELP MEMORY for your options.的问题.看到这篇文章非常实用,转过来方便查阅~ 用 ...

  5. 分享.net常见的内存泄露及解决方法

    分享.net常见的内存泄露及解决方法 关于内存泄漏的问题,之前也为大家介绍过,比如:<C++中内存泄漏的检测方法介绍>,是关于C++内存泄漏的.今天为大家介绍的是关于.NET内存泄漏的问题 ...

  6. UWP游戏防内存修改器的方法

    最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性.于是我把自己见过的三种反修改器的方法给网友们介绍一下. 首先说明一 ...

  7. [转载]C#控制台应用程序里调用自己写的函数的方法

    (2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...

  8. 介绍一种很棒的wince 如何替换系统声音的方法

    Topic:介绍一种很棒的wince 如何替换系统声音的方法(作者:Baiduluckyboy) //------------------------------------------------- ...

  9. 将VirtualBox里安装的虚拟机在后台运行方法(在状态栏隐藏窗口)

    由于工作和学习需要,经常要开一个虚拟机开测试和开发,虚拟机我选择Oracle公司的VirtualBox(用了几年了,感觉不错的一款产品),经常开着这个窗口感觉有些浪费资源,这样隐藏窗口就在需求了. 将 ...

  10. jquery里把数组转换成json的方法

    首先来看,jquery里自带的,和json相关的函数: 1.$.parseJSON  :  用来解析JSON字符串,返回一个对象. 什么叫“JSON字符串”? 比如: var a={name:&quo ...

随机推荐

  1. canvas(七)绘制网格和坐标轴

    1.绘制网格 传入dom和分割线间隔进行渲染,网格线分为水平方向和垂直方向 <script> //绘制网格 function drwaGrid(dom = document.querySe ...

  2. 正则g修饰符对test方法的影响

    标签: js 坑位 最近在使用正则的时候遇到一个问题,从一个数组中选出符合我要求的元素做进一步使用,但正则验证莫名的失效不通过,坑位代码片段如下 测试地址 : var reg = /\[.{32}\] ...

  3. vtkCellLocator IntersectWithLine 返回不是最近的交点

    vtkCellLocator IntersectWithLine 有一个重载函数(下面),返回不是最近的交点,因为到交点的距离没有比较,就直接覆盖了.不知道原本是否就是这样.可以用其他重载代替. in ...

  4. Qt在linux下实现程序编译后版本号自增的脚本

    #! /bin/bash rm -rf temp.cpp num=0 while read line do if [ $num -eq 3 ];then array=(`echo $line | tr ...

  5. CentOS7.8安装k8s

    1, 安装 docker / kubelet # 在 master 节点和 worker 节点都要执行 \# 最后一个参数 1.20.6 用于指定 kubenetes 版本,支持所有 1.20.x 版 ...

  6. Unity 3D简单使用C#脚本,脚本的生命周期

    Unity 3D简单使用 新建项目->层级里右键->创建空对象改名Test 项目里右键创建C#脚本Test 双击脚本Test(所有脚本都会继承MonoBehaviour类),在Start( ...

  7. [Symfony\Component\Process\Exception\RuntimeException] The Process class relies on proc_open, which is not available on your PHP installation.

    [Symfony\Component\Process\Exception\RuntimeException] The Process class relies on proc_open, which ...

  8. Qt编写安防视频监控系统24-自定义悬浮条

    一.前言 自定义悬浮条功能集成在通用视频控件中,就是提供一个顶部的悬浮条,放一排功能按钮,有抓拍.录像.云台控制.关闭等,相当于可以直接单击对应的按钮针对该通道的视频进行操作,悬浮条的含义就是鼠标移入 ...

  9. 大端地址 小端地址 网络字节序 intel主机字节序

    小端字节序:低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序:高字节数据存放在内存低地址处,低字节数据存放在内存高地址处. 网络字节序: MSB 高字节前存法 Most Sign ...

  10. 【记录】使用R2 CDN替换本地项目图片以加速图片加载

    将图片存储到 Cloudflare 的存储桶中,并通过其提供的公共 URL 来替换代码中的本地路径,可以减小项目中打包的图片文件体积 实现方法的详细步骤: 1. 上传图片到 Cloudflare 的存 ...