一种把dump里连续的内存保存到文件的方法

前几天调试一个崩溃,截到一个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编译通过。这里只是简单的测试,没有做异常处理。

posted @ 2022-05-17 10:23  启程软件  阅读(372)  评论(0编辑  收藏  举报