Отладчик: Как получить информацию «Mutex Owned» или «Mutex Free» в аварийном дампе? - PullRequest
3 голосов
/ 23 марта 2012

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

CDB работает нормально, если я вызываю его следующим образом:

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

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

 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 может сохранить информацию, когда я использую / ма, но мой собственный код не может?

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

1 Ответ

2 голосов
/ 23 марта 2012

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

...