void InternalWriteMiniDumpUsingExceptionInfo( unsigned int uStructuredExceptionCode, _EXCEPTION_POINTERS * pExceptionInfo ) { // First try to write it with all the indirectly referenced memory (ie: a large file). // If that doesn't work, then write a smaller one. int iType = MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory; if ( !WriteMiniDumpUsingExceptionInfo( uStructuredExceptionCode, pExceptionInfo, (MINIDUMP_TYPE)iType ) ) { iType = MiniDumpWithDataSegs; WriteMiniDumpUsingExceptionInfo( uStructuredExceptionCode, pExceptionInfo, (MINIDUMP_TYPE)iType ); } }
void VMPI_HandleCrash( const char *pMessage, void *pvExceptionInfo, bool bAssert ) { static LONG crashHandlerCount = 0; if ( InterlockedIncrement( &crashHandlerCount ) == 1 ) { Msg( "\nFAILURE: '%s' (assert: %d)\n", pMessage, bAssert ); // Send a message to the master. char crashMsg[4] = { VMPI_SHARED_PACKET_ID, VMPI_SUBPACKETID_CRASH, 't', ':' }; VMPI_Send2Chunks( crashMsg, sizeof( crashMsg ), pMessage, strlen( pMessage ) + 1, VMPI_MASTER_ID ); // Now attempt to create a minidump with the given exception information if ( pvExceptionInfo ) { struct _EXCEPTION_POINTERS *pvExPointers = ( struct _EXCEPTION_POINTERS * ) pvExceptionInfo; tchar tchMinidumpFileName[_MAX_PATH] = { 0 }; bool bSucceededWritingMinidump = WriteMiniDumpUsingExceptionInfo( pvExPointers->ExceptionRecord->ExceptionCode, pvExPointers, ( MINIDUMP_TYPE )( MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithProcessThreadData ), // ( MINIDUMP_TYPE )( MiniDumpWithDataSegs | MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules | MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithProcessThreadData | MiniDumpWithPrivateReadWriteMemory ), // ( MINIDUMP_TYPE )( MiniDumpNormal ), tchMinidumpFileName ); if ( bSucceededWritingMinidump ) { crashMsg[2] = 'f'; VMPI_SendFileChunk( crashMsg, sizeof( crashMsg ), tchMinidumpFileName ); ::DeleteFile( tchMinidumpFileName ); } } // Let the messages go out. Sleep( 500 ); } InterlockedDecrement( &crashHandlerCount ); }