2011-03-30 9 views
5

मैंने डंप में एक कस्टम स्ट्रीम एम्बेड की है (यानी UserStreamParam तर्क MiniDumpWriteDump फ़ंक्शन पर पास कर दिया है)। अब, मैं WinDbg एक्सटेंशन से स्ट्रीम निकालने का प्रयास कर रहा हूं। (ध्यान दें कि मैंने सत्यापित किया है कि मैं MiniDumpReadDumpStream फ़ंक्शन का उपयोग कर स्ट्रीम पुनर्प्राप्त कर सकता हूं)।मैं WinDbg एक्सटेंशन से उपयोगकर्ता स्ट्रीम कैसे निकालूं?

मैं DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM अनुरोध के साथ IDebugAdvanced2::Request विधि का उपयोग कर रहा हूं। मैं मानक धाराओं से डेटा पुनर्प्राप्त करने में सक्षम हूं। उदाहरण के लिए, निम्न स्निपेट विविध जानकारी स्ट्रीम की सामग्री को सही तरीके से पुनर्प्राप्त करेगा।

DEBUG_READ_USER_MINIDUMP_STREAM rums = {}; 
rums.StreamType = MiscInfoStream; 
rums.Buffer = &buf; 
rums.BufferSize = sizeof buf; 
hr = p->Request(DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM, 
    &rums, sizeof rums, 0, 0, 0); 

हालांकि, अपने ही धारा पुनः प्राप्त करने के प्रयास में कोई त्रुटि (0x80070570, ERROR_FILE_CORRUPT) और WinDbg आउटपुट

Dir entry 11, ??? stream has unknown stream type 6381921 

ध्यान दें कि एक ही संदेश .dumpdebug उत्पादन का एक भाग के रूप में प्रकट होता है का परिणाम देगा।

Stream 11: type ??? (6381921), size 00000038, RVA 00033FA9 
Dir entry 11, ??? stream has unknown stream type 6381921 

समस्या क्या है? मैं अपने उपयोगकर्ता स्ट्रीम की सामग्री कैसे प्राप्त करूं?

उत्तर

0

भले ही परीक्षण नहीं किया गया हो, तो यदि आप MiscInfoStream के बजाय कस्टम मान (LastReservedStream = 0xFFFF से अधिक) के साथ स्ट्रीमटाइप भरते हैं तो इसे काम करना चाहिए।

+0

यही मैंने कोशिश की और यह काम नहीं करता (यही सवाल राज्य का दूसरा हिस्सा है)। – avakar

1

बहुत देर से जवाब

StreamType cannot be UserDefined StreamTypes

jen-lung chiu of ms osronline में इतना तैनात windbg बहुत पहले सूचीबद्ध करता

अगर नवीनतम dbgeng इस सीमा

सफाया आप या तो साथ इसे पुनः प्राप्त है पता नहीं है एक dbghelp फ़ंक्शन स्वतंत्र रूप से

(dbghe का उपयोग करना windbg एक्सटेंशन के अंदर एल.पी. कार्यों की सिफारिश नहीं कर रहे हैं)

या fopen() fread() की तरह एक userdump

(oleg staradumov debuginfo.com writeuserstream.cpp उस में userStreams है) में से कोई

userstream:\>type ..\usrstr.cpp 


#include <stdio.h> 
#include <engextcpp.hpp> 
#include <dbghelp.h> 

const ULONG MBUFFSIZE = 0x1000; 
PVOID Buff = 0; 

int __cdecl ReadUserStream (char *dmpfile) 
{ 
    PMINIDUMP_HEADER MiniHeader = 0; 
    PMINIDUMP_DIRECTORY MiniDir = 0; 
    PMINIDUMP_USER_STREAM userstream = 0; 
    size_t result = 0; 
    ULONG Streams =0; 
    ULONG i = 0; 
    FILE * fp = fopen(dmpfile,"rb"); 
    if (fp) 
    { 
     result = fread(Buff, 1, sizeof(MINIDUMP_HEADER), fp); 
     if (result == sizeof(MINIDUMP_HEADER)) 
     { 
      MiniHeader = (PMINIDUMP_HEADER) Buff; 
      Streams = MiniHeader->NumberOfStreams; 
      for (i = 0; i < Streams; i++) 
      { 
       result = fread(Buff, 1, sizeof(MINIDUMP_DIRECTORY), fp); 
       if (result == sizeof(MINIDUMP_DIRECTORY)) 
       { 
        MiniDir = (PMINIDUMP_DIRECTORY) Buff; 
        if (MiniDir->StreamType > LastReservedStream) 
        { 
         userstream = (PMINIDUMP_USER_STREAM)Buff; 
         ULONG savedbuffsize = userstream->BufferSize; 
         ULONG savedtype = userstream->Type; 
         PCHAR savedbufferptr = (PCHAR)userstream->Buffer; 
         long pos = ftell(fp); 
         fseek(fp, (long)savedbufferptr,SEEK_SET); 
         result = fread(Buff, 1, savedbuffsize, fp); 
         if (result == savedbuffsize) 
         { 
          printf(
           "\n" 
           "Datastream Type = %.8x\n" 
           "Buffer Size  = %.8x\n" 
           "Buffer   = %p\n" 
           "Buffer content = %s\n" 
           "\n", 
           savedtype, 
           savedbuffsize, 
           savedbufferptr, 
           Buff 
           ); 
          fseek(fp,pos,SEEK_SET); 
          continue; 
         } 
         else 
         { 
          printf(
           "failed to read buffer contents at offset %p of 
user stream %x\n", 
           savedbufferptr, 
           savedtype); 
          fseek(fp,pos,SEEK_SET); 
          continue; 
         } 
        } 

       } 
       else 
       { 
        printf("failed to fread Minidump directory exiting \n"); 
        goto getout; 
       } 

      } 
     } 
     else 
     { 
      printf("failed to fread Minidump header exiting \n"); 
      goto getout; 
     } 
    } 
    else 
    { 
     printf("failed to open dmp file exiting \n"); 
     goto getout; 
    } 
getout: 
    if (fp) 
     fclose(fp); 
    return 0; 
} 

int __cdecl main (int argc, char * argv[]) 
{ 
    if (argc !=2) 
    { 
     printf("Usage %s %s\n",argv[0],"somedump.dmp"); 
     return 0; 
    } 
    Buff = malloc(MBUFFSIZE); 
    if (Buff) 
    { 
     ReadUserStream(argv[1]); 
     free(Buff); 
     return 0; 
    } 
    else 
    { 
     printf("malloc failed exiting\n"); 
     return 0; 
    } 
} 

उत्पादन के साथ धारा खुद को पार्स

userstream:\>usrstr.exe 
Usage usrstr.exe somedump.dmp 

userstream:\>usrstr.exe test.dmp 
Datastream Type = 00010000 
Buffer Size  = 00000021 
Buffer   = 000010B6 
Buffer content = This is the first data stream... 


Datastream Type = 00010001 
Buffer Size  = 00000023 
Buffer   = 000010D7 
Buffer content = and this is the second data stream