J'ai créé ma propre application de débogage. Il attache à un processus et crée un fichier de vidage sur incident. Cela fonctionne la plupart du temps. Le problème que j'ai, c'est que cela ne fonctionnera pas lorsque l'application en cours de débogage attend un objet mutex (et c'est le problème même que je veux déboguer).Pourquoi MiniDumpWriteDump échoue?
En outre, j'ai créé une application test.exe simple qui boucle juste et appelle Sleep (100) mais mon débogueur échoue quand il appelle MiniDumpWriteDump sur cette application à chaque fois.
Qu'est-ce que je fais mal?
Le code d'erreur je suis retourné à partir du code ci-dessous est 2147942699 (0x8007012b)
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
;
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);
}
}
J'ai aussi essayé d'augmenter les privilèges avec le code suivant que j'emprunté à quelqu'un d'autre qui semblait avoir un effet semblable problème:
BOOL SetDumpPrivileges()
{
BOOL fSuccess = FALSE;
HANDLE TokenHandle = NULL;
TOKEN_PRIVILEGES TokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&TokenHandle))
{
printf("Could not get the process token");
goto Cleanup;
}
TokenPrivileges.PrivilegeCount = 1;
if (!LookupPrivilegeValue(NULL,
SE_DEBUG_NAME,
&TokenPrivileges.Privileges[0].Luid))
{
printf("Couldn't lookup SeDebugPrivilege name");
goto Cleanup;
}
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//Add privileges here.
if (!AdjustTokenPrivileges(TokenHandle,
FALSE,
&TokenPrivileges,
sizeof(TokenPrivileges),
NULL,
NULL))
{
printf("Could not revoke the debug privilege");
goto Cleanup;
}
fSuccess = TRUE;
Cleanup:
if (TokenHandle)
{
CloseHandle(TokenHandle);
}
return fSuccess;
}
Salut, La chose ci-dessus ne fonctionne pas pour moi. La chose est que j'ai mon MiniDump écrit à partir d'un processus séparé. Est-ce que le vôtre est un gestionnaire de crash hors processus? ou en cours? Pouvez-vous clarifier? –