SparkyNZ SparkyNZ - 1 month ago 15
C Question

Debugger: How do I get "Mutex Owned" or "Mutex Free" info in a crash dump?

I don't know what I'm not doing but I simply cannot get my own debugger to save the "Mutex Owned" or "Mutex Free" info for the application being debugged.

CDB works fine if I call it as follows:

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


When I open the crash dump file in WinDbg and type the following commands, I see the Mutex Free or Mutex Owned states:

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


Below is my function - I had to comment out some of the MiniDumpWith options as it would not write the crash dump file at all unless I commented them out.

Anybody know why CDB can save the info when I use /ma and yet my own code cannot?

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

Answer

I've reposted again so you can accept it as an answer:

Does it not include the mutex information even with flag MiniDumpWithHandleData, also it is possibly failing because some of the flags may not be compatible with the version of DebugHlp.dll you are calling against see: here

Comments