1

当我的程序崩溃时,它会从未处理的异常处理程序中创建一个小型转储。我遇到的问题是人们向我发送故障转储,但是当我尝试在 Visual Studio 2010 中打开它们时,它说它们已损坏(“转储文件的格式无效”)。我没有分发dbghelp.dll我的程序,我需要吗?我假设如果是版本问题,Visual Studio 会让我知道并且不会输出上述消息。

我用来生成日志的代码是

LONG WINAPI OnUnhandledException(PEXCEPTION_POINTERS pExceptionInfo)
    {
        MINIDUMP_EXCEPTION_INFORMATION ei;
        ei.ExceptionPointers = pExceptionInfo;
        ei.ThreadId = GetCurrentThreadId();
        ei.ClientPointers = FALSE;

        DWORD dwProcessId = GetCurrentProcessId();
        SYSTEMTIME stLocalTime;
        GetLocalTime(&stLocalTime);
        wchar_t CrashDumpW[1024];
        swprintf_s(CrashDumpW, NELEMS(CrashDumpW), 
                L"%s\\%s-%s-%04X-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", 
                g_CrashDirectory.c_str(), L"Program", MAJOR_VERSION_STR, 
                INTERNAL_VERSION, stLocalTime.wYear, stLocalTime.wMonth,
                stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, 
                stLocalTime.wSecond, dwProcessId, ei.ThreadId);

        HANDLE hFile = CreateFileW(CrashDumpW, GENERIC_READ | GENERIC_WRITE,
            NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        MiniDumpWriteDump(GetCurrentProcess(), dwProcessId, hFile, 
            MiniDumpScanMemory, &ei, NULL, NULL);
        CloseHandle(hFile);

        return EXCEPTION_EXECUTE_HANDLER;
    }
4

1 回答 1

1

这可能是由某人调试您的进程引起的。我注意到,如果一个进程附加了调试器,它产生的小型转储通常会以完全相同的方式损坏。它们的尺寸比正常生产的要小。

由于您EXCEPTION_EXECUTE_HANDLER从处理程序返回,默认的未处理异常处理程序将在您的处理程序之后执行,这可能会导致 DrWatson 发挥作用并作为调试器附加到您的进程。

于 2013-08-21T19:23:51.137 回答