2012-03-23 5 views
2

나는 내 자신의 디버거 응용 프로그램을 만들었습니다. 프로세스에 연결하고 크래시 덤프 파일을 만듭니다. 그것은 대부분의 시간 동안 작동합니다. 내가 가진 문제는 디버깅되는 응용 프로그램이 뮤텍스 개체를 기다리고있을 때 작동하지 않는다는 것입니다 (디버깅하려는 문제입니다).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; 
} 

답변

2

MSDN과 누군가에 대한 질문이 친절하게 제 문제에 대한 답을주었습니다. 토론에 대한 내용은 link이고 아래에 복사 한 작업 코드 스 니펫이 있습니다.

void WriteCrashDump(EXCEPTION_DEBUG_INFO *pExceptionInfo) 
{ 
    CONTEXT c; 

    memset(&c, 0, sizeof(c)); 

    HANDLE hThread; 
    c.ContextFlags = CONTEXT_FULL; 
    hThread = _OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadId); 

    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.ExceptionPointers->ContextRecord = &c; 
    minidump_exception.ClientPointers = false; 

    char txDumpPath[ MAX_PATH + 1 ]; 

    time_t tNow = time(NULL); 
    struct tm *pTm = localtime(&tNow); 

    sprintf(txDumpPath, "%s.%02d%02d%04d_%02d%02d%02d.dmp", 
      txProcess, 
      pTm->tm_mday, 
      pTm->tm_mon, 
      pTm->tm_year, 
      pTm->tm_hour, 
      pTm->tm_min, 
      pTm->tm_sec); 

    HANDLE hFile = CreateFile(txDumpPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

    if(hFile != INVALID_HANDLE_VALUE) 
    { 
    BOOL fSuccess; 

    printf("hProcess : %d (0x%x)\n", hProcess, hProcess); 
    printf("dwProcessId: %u (0x%lx)\n", dwProcessId, dwProcessId); 
    printf("dwThreadId : %u (0x%lx)\n", dwThreadId, dwThreadId); 

    SetLastError(0L); 

    fSuccess = MiniDumpWriteDump(hProcess, 
            dwProcessId, 
            hFile, 
            MiniDumpNormal, 
            &minidump_exception, 
            NULL, 
            NULL); 

    DWORD dwErr = GetLastError(); 

    if(! fSuccess) 
    { 
     printf("MiniDumpWriteDump -FAILED (LastError:%u)\n", dwErr); 

     LPVOID lpMsgBuf; 

     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
        NULL, 
        dwErr, 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
        (LPTSTR) &lpMsgBuf, 
        0, 
        NULL); 

     // Display the string. 
     printf("%s\n", (LPCTSTR)lpMsgBuf); 

     // Free the buffer. 
     LocalFree(lpMsgBuf); 
    } 
    } 

    if(hThread) 
    CloseHandle(hThread); 
} 
+0

안녕하세요, 위의 일은 나를 위해 작동하지 않습니다. 것은 내가 별도의 프로세스에서 작성된 내 MiniDump 있습니다. 프로세스 충돌 처리기에서 벗어 났습니까? 또는 진행 중입니까? 그냥 분명히 해줄 수 있니? –

0

이 문제는이 텍스트로 대답 다른 question과 같은 하나인가?

그것은 심지어 플래그 MiniDumpWithHandleData와 뮤텍스 정보를 포함 하는가, 플래그 중 일부는 debughlp.dll의 볼에 전화하는 버전과 호환되지 않을 수 있기 때문에 또한 가능성이 실패 : I 게시 here

+0

안녕하세요. 아니, 그 다른 문제. 이전 질문은 핸들 정보 작성과 관련이있었습니다. 여기서 설명하는 문제는 MiniDumpWriteDump가 대부분의 처리를 위해 아무 것도 쓸 수 없다는 것입니다. 작은 테스트 응용 프로그램이 있고 모든 종류의 덤프를 만들지 않습니다 (크기가 0 바이트 인 파일을 만듭니다). 더 큰 앱 중 하나에 디버거 앱을 연결하면 덤프를 작성합니다. – SparkyNZ

관련 문제