一种把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编译通过。这里只是简单的测试,没有做异常处理。