나는 내 자신의 디버거 응용 프로그램을 만들었습니다. 프로세스에 연결하고 크래시 덤프 파일을 만듭니다. 그것은 대부분의 시간 동안 작동합니다. 내가 가진 문제는 디버깅되는 응용 프로그램이 뮤텍스 개체를 기다리고있을 때 작동하지 않는다는 것입니다 (디버깅하려는 문제입니다).MiniDumpWriteDump가 실패하는 이유는 무엇입니까?
또한, 루프를 돌리고 Sleep (100)을 호출하는 간단한 test.exe 응용 프로그램을 만들었지 만 매번이 응용 프로그램에서 MiniDumpWriteDump를 호출 할 때 디버거가 실패합니다.
내가 뭘 잘못하고 있니?
나는 아래의 코드에서 반환받을 오류 코드는 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);
}
}
문제 :
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;
}
안녕하세요, 위의 일은 나를 위해 작동하지 않습니다. 것은 내가 별도의 프로세스에서 작성된 내 MiniDump 있습니다. 프로세스 충돌 처리기에서 벗어 났습니까? 또는 진행 중입니까? 그냥 분명히 해줄 수 있니? –