qtcreator 中mingw和msvc生成 .dmp .pdb 文件 windbg

qtcreator版本 Qt Creator 4.11.0

使用msvc2015 32bit编译器:分为debug和release两种

新建工程:TestDump.pro

//cusdump.h  头文件

#ifndef CUSDUMP_H
#define CUSDUMP_H
#pragma once
#include 
#include 
#include 

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

int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
{
    // 定义函数指针
    typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
        HANDLE,
        DWORD,
        HANDLE,
        MINIDUMP_TYPE,
        PMINIDUMP_EXCEPTION_INFORMATION,
        PMINIDUMP_USER_STREAM_INFORMATION,
        PMINIDUMP_CALLBACK_INFORMATION
        );
    // 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数
    MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;
    HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
    if (NULL == hDbgHelp)
    {
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");

    if (NULL == pfnMiniDumpWriteDump)
    {
        FreeLibrary(hDbgHelp);
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    // 创建 dmp 文件件   //源程序这里用的是两个TCHAR,我不会用,改成了char,能生成文件,但是文件名有一半是乱码
    TCHAR szFileName[MAX_PATH] = { 0 };
    TCHAR szVersion[] =L"DumpFile";
    SYSTEMTIME stLocalTime;
    GetLocalTime(&stLocalTime);
    wsprintf((LPWSTR)szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp",
        szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
        stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
    HANDLE hDumpFile = CreateFile((LPCWSTR)szFileName, GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
    if (INVALID_HANDLE_VALUE == hDumpFile)
    {
        FreeLibrary(hDbgHelp);
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    // 写入 dmp 文件
    MINIDUMP_EXCEPTION_INFORMATION expParam;
    expParam.ThreadId = GetCurrentThreadId();
    expParam.ExceptionPointers = pExceptionPointers;
    expParam.ClientPointers = FALSE;
    pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
        hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);
    // 释放文件
    CloseHandle(hDumpFile);
    FreeLibrary(hDbgHelp);
    return EXCEPTION_EXECUTE_HANDLER;
}

LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
    // 这里做一些异常的过滤或提示
    if (IsDebuggerPresent()) {
        return EXCEPTION_CONTINUE_SEARCH;
    }
    return GenerateMiniDump(lpExceptionInfo);
}
#endif // CUSDUMP_H

//main.cpp

#include "mainwindow.h"
#include 

#include "cusdump.h"

int main(int argc, char *argv[])
{
    SetUnhandledExceptionFilter(ExceptionFilter);//调用生成dump文件的功能

    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

//mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    int *p = nullptr;//这里会出错,检验dmp
    *p = 100;
}

MainWindow::~MainWindow()
{
    delete ui;
}

debug:构建(相当于编译)会生成...\build-TestDump-Desktop_Qt_5_9_9_MSVC2015_32bit-Debug文件夹,debug文件中会有TestDump.pdb生成,运行后,会有DumpFile-20230329-221210.dmp文件生成   

release:直接使用上面的工程,release版本是没有pdb文件生成的

需要在.pro文件中加入

CONFIG += force_debug_info
CONFIG += senarate_debug_info
或者加入
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

才能生成.pdb文件。

改完pro文件,构建项目,生成...\build-TestDump-Desktop_Qt_5_9_9_MSVC2015_32bit-Release文件夹,release文件夹里会有TestDump.pdb文件生成,运行工程,会有DumpFile-20230329-191210.dmp文件生成

msvc编译器下,debug和release生成的dmp文件都可以直接VS打开  ,使用 仅限本机 进行调试,定位到错误的代码行。PDB(Program DataBase),意即程序的基本数据。

要删除构建生成的build...文件夹,再进行下一次构建,不然可能不会生成新的。

MinGW5.3.0 32bit编译器进行编译:debug和release两种

同样使用工程TestDump.pro,但是mingw不能生成pdb文件,能生成dmp文件。

使用cv2pdb可以生成pdb文件,但是使用VS打开dmp文件进行调试时,是打不开的,还没找到方法

生成程序崩溃的dump文件,使用windbg调试     以后再看

https://www.cnblogs.com/dpsying/p/13622956.html

VS2005调试dmp文件常见问题  以后看

VS2005调试dmp文件常见问题 - wrhwww - C++博客

如何定位Bug(WinDbg)——Qt

如何定位Bug(WinDbg)——Qt_十年之少的博客-CSDN博客

你可能感兴趣的:(qt,qt,开发语言)