当前位置:   article > 正文

C++如何在崩溃时捕获异常后且生成dump调试文件_c++ 崩溃捕获功能

c++ 崩溃捕获功能

1、用途目的

  windows程序在运行时有时候会发生未知的异常错误,有时候调试也不太好定位,此时就需要加载调试dump文件来查找异常,因此需要生成dump异常文件。

2、生成*.dump文件

namespace DumpError
{
void DbgDumpErrorFile(struct _EXCEPTION_POINTERS* excpInfo, const char* szDmpFile);

void DbgDumpErrorFileEx(struct _EXCEPTION_POINTERS* excpInfo, const char* szDmpFilePrex);
};

void DumpError::DbgDumpErrorFileEx(struct _EXCEPTION_POINTERS* excpInfo, const char* szDmpFilePrex)
{
    char szDumpPath[2 * _MAX_PATH] = {0};
    char szDumpFile[_MAX_PATH] = {0};
    GetModuleFileNameA(nullptr, szDumpPath, _MAX_PATH);
    char* szPos = strrchr(szDumpPath, _T('\\'));
    if (szPos == nullptr)
        return;

    szPos[1] = 0;
    strcat(szDumpPath, "log"); // NOLINT
    _mkdir(szDumpPath);

    time_t timeCurrent = time(nullptr);
    const struct tm* tmc = localtime(&timeCurrent);
    if (tmc)
        sprintf_s(szDumpFile, _MAX_PATH, "\\%s%d_%d_%d_%d_%d(0x%p).dmp", szDmpFilePrex, tmc->tm_mon + 1, tmc->tm_mday, tmc->tm_hour, tmc->tm_min, tmc->tm_sec, excpInfo);
    else
        strcpy_s(szDumpFile, _MAX_PATH, "\\error.dmp");

    strcat(szDumpPath, szDumpFile); // NOLINT

    DbgDumpErrorFile(excpInfo, szDumpPath);
}

void DumpError::DbgDumpErrorFile(struct _EXCEPTION_POINTERS* excpInfo, const char* szDmpFile)
{
    HMODULE hDll = ::LoadLibraryA("DBGHELP.DLL");

    MINIDUMPWRITEDUMP pDump = nullptr;

    if (hDll)
        pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");

    if (pDump)
    {
        // create the file
        HANDLE hFile = ::CreateFileA(szDmpFile, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL, nullptr);

        if (hFile != INVALID_HANDLE_VALUE)
        {
            if (excpInfo == nullptr) // 如果没有传入异常, 比如是在程序里面调用的, 生成一个异常
            {
                // Generate exception to get proper context in dump

                DWORD dwSize = 0;
                const char* sz = "_EXCEPTION_POINTERS is null";
                ::WriteFile(hFile, sz, static_cast<int>(strlen(sz)), &dwSize, nullptr);
            }
            else
            {
                MINIDUMP_EXCEPTION_INFORMATION eInfo{};
                eInfo.ThreadId = GetCurrentThreadId(); // 把需要的信息添进去
                eInfo.ExceptionPointers = excpInfo;
                eInfo.ClientPointers = FALSE;

                // Dump的类型是小型的, 节省空间. 可以参考MSDN生成更详细的Dump.
                pDump(
                    GetCurrentProcess(),
                    GetCurrentProcessId(),
                    hFile,
                    MiniDumpNormal,
                    excpInfo ? &eInfo : nullptr,
                    nullptr,
                    nullptr);
            }
            ::CloseHandle(hFile);
        }
    }

    if (hDll)
        ::FreeLibrary(hDll);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

3、用法

int ExceptFilterFunc(EXCEPTION_POINTERS* pExp)
{
    HRDErrorUtils::DbgDumpErrorFileEx(pExp, "main");

    return EXCEPTION_EXECUTE_HANDLER;	
}
int main(int argc, char* argv[])
{
    int nRet = 0;
    __try
    {
        nRet = DoSomething(argc, argv);
    }
    __except (ExceptFilterFunc(GetExceptionInformation()))
    {
        OutputDebugString(L"DoSomething Except");
        nRet = 0;
    }

    OutputDebugString(L"ain return ");

    return nRet;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/245750
推荐阅读
相关标签
  

闽ICP备14008679号