QT winsows 应用程序创建dump崩溃日志方法

版权声明: https://blog.csdn.net/xiezhongyuan07/article/details/86491460

在我们的程序崩溃的时候,往往是不容易查找运行到哪一步出错了,或者是不容易查找崩溃的原因,这时候我们可以引进windows的api 来进行系统级别的崩溃日志收集,当应用程序崩溃时候自动生成.dump崩溃日志文件。

需要头文件

#include <Dbghelp.h>

定义一个方法

static LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo)
{
    Application *app = Application::app();
    QString savePath = app->binPath() + "dump/";
    QDir dir(savePath);
    if (!dir.exists() && !dir.mkpath(savePath)) {
        app->exit(E_UNEXPECTED);
        return EXCEPTION_EXECUTE_HANDLER;
    }

    savePath.append("assit_");
    savePath.append(QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
    savePath.append(".dmp");

    HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,
        0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (INVALID_HANDLE_VALUE == dump) {
        app->exit(E_UNEXPECTED);
        return EXCEPTION_EXECUTE_HANDLER;
    }

    MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;
    miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;
    miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();
    miniDumpExceptionInfo.ClientPointers = TRUE;
    DWORD idProcess = GetCurrentProcessId();
    MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,
        MiniDumpNormal, &miniDumpExceptionInfo, NULL, NULL);

    CloseHandle(dump);

    app->exit(E_UNEXPECTED);
    return EXCEPTION_EXECUTE_HANDLER;
}

在main函数,或者初始化之后,进行调用:

SetUnhandledExceptionFilter(exceptionCallback);

这样在软件崩溃之后,就会自动生成崩溃日志.

特别需要记住的一点 ,就是dmp文件必须与.pdb文件联合使用,才能定位问题,所以,每个版本的exe,必须保存与之对应的.pdb文件。

QT 对于debug版本,会自动生成.pdb文件

对于release版本,自动默认不会生成.pdb文件

那么下一个问题就是QT项目中,怎样让release版本怎样生成pdb文件?

解决方案:

在pro配置文件中,添加:

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

猜你喜欢

转载自blog.csdn.net/xiezhongyuan07/article/details/86491460