Bootstrap

visual studio + qt + mingw/msvc程序崩溃时生成dump文件代码

vs 结合qt mingw写一段程序崩溃生成dump文件的代码

以下是一个结合Visual Studio和Qt使用MinGW编译器的程序,当程序崩溃时会自动生成dump文件的示例代码:

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>

#include <windows.h>
#include <signal.h>
#include <dbghelp.h>

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    // 创建Dump文件
    QDateTime dateTime = QDateTime::currentDateTime();
    QString fileName = "Crash_" + dateTime.toString("yyyyMMddhhmmss") + ".dmp";
    HANDLE hDumpFile = CreateFile((LPCTSTR)fileName.utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hDumpFile != INVALID_HANDLE_VALUE) {
        // Dump信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        // 写入Dump文件
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
        CloseHandle(hDumpFile);
    }
    // 返回异常代码
    return EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    // 设置异常处理函数
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

    QCoreApplication app(argc, argv);

    // 测试程序崩溃
    qDebug() << "Before crash.";
    int *p = nullptr;
    *p = 0;
    qDebug() << "After crash.";

    return app.exec();
}

这段代码在main函数中使用qDebug打印了一些信息,然后手动触发了一个程序崩溃(通过将一个空指针*p赋值为0)。程序会在崩溃时自动调用ApplicationCrashHandler函数,创建一个Dump文件,并将崩溃信息写入其中。请注意,这段代码需要在Windows操作系统上使用,且需要安装Debugging Tools for Windows,以便使用MiniDumpWriteDump函数生成Dump文件。

vs 集合qt mingw如何调试dump文件

在Visual Studio集成Qt和MinGW的开发环境中,可以使用以下步骤调试Dump文件:

  1. 打开Visual Studio,选择“文件”->“打开”->“文件”(或使用快捷键Ctrl + Shift + O)打开程序的工程文件。

  2. 打开程序的属性页,选择“调试”选项卡,在“命令”一栏中填入程序的可执行文件路径。

  3. 在“调试”选项卡中选择“启用本机代码调试”和“生成调试信息”,并取消勾选“只启动可执行文件”。

  4. 在程序崩溃时,会在程序崩溃的目录下生成一个Dump文件,使用Visual Studio打开该Dump文件。

  5. 在Visual Studio中选择“调试”->“窗口”->“分析器”,在分析器窗口中可以查看Dump文件中的崩溃信息。

  6. 在分析器窗口中,可以看到堆栈信息和变量值等调试信息。根据这些信息,可以确定程序崩溃的原因。

  7. 在程序的源代码中,添加断点以定位问题,并重新运行程序。此时,Visual Studio会自动加载Dump文件并跳转到崩溃时的代码行,以方便进行调试。

注意:如果使用的是Release版本的程序,需要手动生成Dump文件。可以使用上述代码示例中提供的方法生成Dump文件,或使用第三方工具(如procdump)进行生成。生成Dump文件后,需要使用Debug版本的Visual Studio打开该Dump文件进行调试。可以使用windbg等工具。

结合vs和Qt使用MSVC编译器的程序,当程序崩溃时会自动生成dump文件的示例代码

#include <QtWidgets/QApplication>
#include <QtCore/QDir>
#include <QtCore/QProcess>
#include <Windows.h>
#include <DbgHelp.h>
#include <iostream>

#pragma comment(lib, "DbgHelp.lib")

// 获取Dump文件路径
QString GetDumpFilePath()
{
    QString dumpFilePath;
    TCHAR szDumpPath[MAX_PATH] = { 0 };
    if (GetTempPath(MAX_PATH, szDumpPath))
    {
        dumpFilePath = QString::fromWCharArray(szDumpPath) + "MyApp.dmp";
    }
    return dumpFilePath;
}

// 生成Dump文件
LONG WINAPI GenerateDumpFile(EXCEPTION_POINTERS* pException)
{
    HANDLE hDumpFile = CreateFileW(GetDumpFilePath().toStdWString().c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo = { 0 };
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ClientPointers = FALSE;
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, nullptr, nullptr);
        CloseHandle(hDumpFile);
    }
    return EXCEPTION_EXECUTE_HANDLER;
}

// 处理崩溃信号的函数
void CrashHandler(int signal)
{
    EXCEPTION_POINTERS* pException = nullptr;
    switch (signal)
    {
    case SIGABRT:
    case SIGFPE:
    case SIGILL:
    case SIGINT:
    case SIGSEGV:
    case SIGTERM:
        pException = reinterpret_cast<EXCEPTION_POINTERS*>(_pxcptinfoptrs);
        break;
    default:
        break;
    }
    if (pException != nullptr)
    {
        GenerateDumpFile(pException);
    }
}

int main(int argc, char *argv[])
{
    // 注册处理崩溃信号的函数
    signal(SIGABRT, CrashHandler);
    signal(SIGFPE, CrashHandler);
    signal(SIGILL, CrashHandler);
    signal(SIGINT, CrashHandler);
    signal(SIGSEGV, CrashHandler);
    signal(SIGTERM, CrashHandler);

    QApplication app(argc, argv);

    // TODO: 程序主体代码

    return app.exec();
}

在程序中,我们首先定义了一个函数GetDumpFilePath(),用于获取生成Dump文件的路径。在该函数中,我们使用GetTempPath()获取系统临时目录,并在临时目录下生成名为MyApp.dmp的Dump文件。

接着,我们定义了一个函数GenerateDumpFile(),用于生成Dump文件。该函数中,我们使用CreateFileW()创建Dump文件,并使用MiniDumpWriteDump()将Dump信息写入文件中。

最后,我们在main()函数中注册处理崩溃信号的函数CrashHandler(),并在程序主体代码中添加自己的代码。在CrashHandler()函数中,我们根据不同的崩溃信号,将指向异常信息的指针传递给GenerateDumpFile()函数,以生成Dump文件。

当程序崩溃时,系统会自动调用处理崩溃

mark: openAI

;