调试器:如何在崩溃转储中获得“Mutex Owned”或“Mutex Free”信息?

我不知道我在做什么,但我根本无法获得自己的调试器来保存正在调试的应用程序的“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可以在我使用/ 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 ); } } 

即使使用标志MiniDumpWithHandleData也不包含互斥锁信息,它也可能失败,因为某些标志可能与您要调用的DebugHlp.dll版本不兼容。 请参见MINIDUMP_TYPE枚举