Я не знаю, чего я не делаю, но я просто не могу получить свой собственный отладчик, чтобы сохранить информацию «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);
}
}