2012-03-22 2 views
3

Я не знаю, чего я не делаю, но я просто не могу получить свой собственный отладчик, чтобы сохранить информацию «Mutex Owned» или «Mutex Free» для отлаживаемого приложения.Отладчик: Как я могу получить информацию «Mutex Owned» или «Mutex Free» в аварийном дампе?

ЦКБ работает отлично, если я называю это следующим образом:

cdb -pn test.exe -c ".dump /f /ma /u test.dmp;.detach;q" 

При открытии файла дампа в WinDbg и введите следующие команды, я вижу мьютекса Free или мьютекс Принадлежит государство:

0:001> !handle 0 f Mutant 
Handle 7f4 
    Type    Mutant 
    Attributes  0 
    GrantedAccess 0x1f0001: 
     Delete,ReadControl,WriteDac,WriteOwner,Synch 
     QueryState 
    HandleCount  2 
    PointerCount  4 
    Name    \BaseNamedObjects\PAUL_HANG_MUTEX 
    Object Specific Information 
Mutex is Owned <--- THIS HERE IS WHAT I WANT TO SEE 

Ниже приведена моя функция - мне пришлось прокомментировать некоторые параметры MiniDumpWith, так как она вообще не будет записывать файл дампа сбоя, если я не прокомментирую их.

Кто-нибудь знает, почему CDB может сохранять информацию, когда я использую/ma, но мой собственный код не может?

void WriteCrashDump(EXCEPTION_DEBUG_INFO *pExceptionInfo) 
{ 
    CONTEXT c; 

    memset(&c, 0, sizeof(c)); 

    GetThreadContext(hThread, &c); 

    EXCEPTION_POINTERS ep; 

    memset(&ep, 0, sizeof(ep)); 

    ep.ContextRecord = &c; 
    ep.ExceptionRecord = &pExceptionInfo->ExceptionRecord; 

    MINIDUMP_EXCEPTION_INFORMATION minidump_exception; 

    memset(&minidump_exception, 0, sizeof(minidump_exception)); 

    minidump_exception .ThreadId   = dwThreadId; 
    minidump_exception.ExceptionPointers = &ep; 
    minidump_exception.ClientPointers = true; 

    char txDumpPath[ MAX_PATH + 1 ]; 

    sprintf(txDumpPath, "%s.dmp", txProcess); 

    HANDLE hFile = CreateFile(txDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

    if(hFile) 
    { 
    BOOL fSuccess; 


    SetLastError(0L); 

    int nDumpOptions = 

    MiniDumpNormal 
| MiniDumpWithDataSegs     
| MiniDumpWithFullMemory     
| MiniDumpWithHandleData     
| MiniDumpFilterMemory     
| MiniDumpScanMemory      
| MiniDumpWithUnloadedModules   
| MiniDumpWithIndirectlyReferencedMemory 
| MiniDumpFilterModulePaths    
| MiniDumpWithProcessThreadData   
| MiniDumpWithPrivateReadWriteMemory  
| MiniDumpWithoutOptionalData   
//| MiniDumpWithFullMemoryInfo    
//| MiniDumpWithThreadInfo     
//| MiniDumpWithCodeSegs     
//| MiniDumpWithoutManagedState   
    ; 

    fSuccess = MiniDumpWriteDump(hProcess, 
            dwProcessId, 
            hFile, 
            (MINIDUMP_TYPE) nDumpOptions, 
            &minidump_exception, 
            NULL, 
            NULL); 

    DWORD dwErr = GetLastError(); 

    if(! fSuccess) 
      printf("MiniDumpWriteDump -FAILED (LastError:%u)\n", dwErr); 

     CloseHandle(hFile); 
    } 
} 

ответ

2

ли не включать в себя информацию о мьютексе, даже с флагом MiniDumpWithHandleData, также, возможно, неудачи, потому что некоторые из флагов могут быть не совместимы с версией DebugHlp.dll вы звоните против. См. MINIDUMP_TYPE enumeration

 Смежные вопросы

  • Нет связанных вопросов^_^