2011-03-30 13 views
5

Tôi đã nhúng luồng tùy chỉnh vào một bãi chứa (tức là đã chuyển đối số UserStreamParam thành hàm MiniDumpWriteDump). Bây giờ, tôi đang cố gắng trích xuất luồng từ tiện ích mở rộng WinDbg. (Lưu ý rằng tôi đã xác minh rằng tôi có thể truy xuất luồng bằng chức năng MiniDumpReadDumpStream).Làm cách nào để trích xuất luồng người dùng từ tiện ích mở rộng WinDbg?

Tôi đang sử dụng phương thức IDebugAdvanced2::Request với yêu cầu DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM. Tôi có thể truy xuất dữ liệu từ luồng chuẩn. Ví dụ: đoạn mã sau sẽ truy xuất chính xác nội dung của luồng thông tin misc.

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); 

Tuy nhiên, cố gắng để lấy dòng của riêng tôi sẽ dẫn đến một lỗi (0x80070570, ERROR_FILE_CORRUPT) và đầu ra WinDbg

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

Lưu ý rằng cùng một thông điệp xuất hiện như là một phần của .dumpdebug đầu ra.

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

Sự cố là gì? Làm cách nào để truy xuất nội dung luồng người dùng của tôi?

Trả lời

0

Thậm chí nếu không được kiểm tra, nó sẽ hoạt động nếu bạn điền vào StreamType với giá trị tùy chỉnh (lớn hơn LastReservedStream = 0xFFFF) thay vì MiscInfoStream.

+0

Đó là những gì tôi đã thử và nó không hoạt động (đó là phần thứ hai của câu hỏi nêu). – avakar

1

rất muộn câu trả lời

StreamType cannot be UserDefined StreamTypes

jen-lung chiu of ms posted như vậy trong osronline windbg liệt kê dài trở lại

không biết nếu dbgeng mới nhất có hạn chế này loại bỏ

bạn hoặc lấy nó với hàm dbghelp độc lập

(sử dụng dbghe chức năng lp bên trong phần mở rộng windbg không được khuyến khích)

hoặc phân tích dòng mình với fopen() fread() như dưới đây

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; 
    } 
} 

đầu ra từ một userdump có userStreams trong đó

(oleg staradumov debuginfo.com writeuserstream.cpp)

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