1. 程式人生 > 其它 >一種把dump裡連續的記憶體儲存到檔案的方法

一種把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編譯通過。這裡只是簡單的測試,沒有做異常處理。