• 4950阅读
  • 3回复

[原创]qt 获取windows下崩溃日志的三种方法 [复制链接]

上一主题 下一主题
离线shixingya
 

只看楼主 倒序阅读 楼主  发表于: 2018-05-07
long __stdcall   MinGW_Callback(_EXCEPTION_POINTERS*   excp)
{
    CCrashStack crashStack(excp);
    QString sCrashInfo = crashStack.GetExceptionInfo();
    qDebug()<<"发生错误MinGW_Callback:\n"<<sCrashInfo;


    QMessageBox box;
    QString msg ="";
    msg.append("亲,我死了,重新启动下吧!");
  
    qDebug()<<msg;
    box.setWindowTitle("错误报告");
    box.setText(msg);
    ::SetCursor(LoadCursor(NULL,   IDC_ARROW));
    box.exec();


    return   EXCEPTION_EXECUTE_HANDLER;
}
参考帖子 https://blog.csdn.net/wangshubo1989/article/details/52586516
本人2008年9月至2012年6月在三亚学院学习计算机科学与技术专业四年,2012年6月毕业后至今一直在北京市从事软件开发相关工作。本人的技术栈是C++、熟悉Qt、CEF框架。参与或负责过多款Windows、Linux环境下桌面软件的研发。
参加工作十年来,使用Qt参与开发过一个军工仿真想定建模工具,仿真陆、海、空潜等各兵种的作战平台(包括地面车辆、水面舰艇、固定翼/旋转翼飞机、潜艇等)的运动方式和工作流程,实现陆、海、空、潜立体化协同作战仿真。在国美调研过电商OA办公工具的开发设计、在广联达参与了BIM软件的协作开发、在书生电子独立负责过OFD版式阅读器客户端的开发、在跟谁学使用Qt WebEngine、QGraphics等主导了练习批改工具的开发,在蓝湖基于WebAssembly对标Figma参与开发了一款原型设计工具mastergo,在小米集团技术委员会承担了平台应用研发工作,目前在凌云光从事视觉相关应用平台开发。十多年的软件开发工作,让我在软件工程、程序设计、系统架构方面积累了丰富且宝贵的经验。
有同行的朋友,可以加我微信,一起进步
我叫史星亚 微信: EagleAndy  
加好友时请备注  来自qtcn
我有个Qt交友群,拉您入群
非工作时间 可以电联 18610042411
*********************************************************
另低价出售
→各种软件小程序定制!
→SAP教程,涵盖BI/SD/FICO/HANA等各种模块视频教程,购买教程,拾取金领顾问教程!
→各种考证考研题库,保证考证考研成功上岸!
→抖音快手微博朋友圈各种点赞支持,最快一分钟上万赞!
→挂机打卡,远程叫醒,等各种服务欢迎私信EagleAndy开启!
转发此内容,私信EagleAndy,有定制盲盒寄送!
离线shixingya

只看该作者 1楼 发表于: 2018-05-07
方式二

方式二
static LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    ::SetCursor(LoadCursor(NULL,   IDC_NO));
    //And output crash information
    EXCEPTION_RECORD *record = pException->ExceptionRecord;
    QString errCode(QString::number(record->ExceptionCode, 16));
    QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
    QString errFlag(QString::number(record->ExceptionFlags, 16));
    QString errPara(QString::number(record->NumberParameters, 16));
    qDebug()<<"errCode: "<<errCode;
    qDebug()<<"errAddr: "<<errAddr;
    qDebug()<<"errFlag: "<<errFlag;
    qDebug()<<"errPara: "<<errPara;
    //Create the dump file
    QString DumpFilePath =UserCacheDataDir;
    DumpFilePath.append("/").append(QString::number(getTimeStamp())).append(".dmp");

    HANDLE hDumpFile = CreateFile((LPCWSTR)DumpFilePath.utf16(),
                                  GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    QString errUrl="";
    if(hDumpFile != INVALID_HANDLE_VALUE) {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
        CloseHandle(hDumpFile);
        qDebug()<<"生成DMP文件"<<DumpFilePath;  

    QMessageBox box;
    QString msg ="";
    msg.append("亲,我死了,重新启动下吧!").append(" \n详细错误信息见: ").append(DumpFilePath);
    if(errUrl !="")
    {
        msg.append(" ;错误文件已经上传,地址为:").append(errUrl);
    }
    qDebug()<<msg;
    box.setText(msg);
    ::SetCursor(LoadCursor(NULL,   IDC_ARROW));
    box.exec();
    return EXCEPTION_EXECUTE_HANDLER;
}
本人2008年9月至2012年6月在三亚学院学习计算机科学与技术专业四年,2012年6月毕业后至今一直在北京市从事软件开发相关工作。本人的技术栈是C++、熟悉Qt、CEF框架。参与或负责过多款Windows、Linux环境下桌面软件的研发。
参加工作十年来,使用Qt参与开发过一个军工仿真想定建模工具,仿真陆、海、空潜等各兵种的作战平台(包括地面车辆、水面舰艇、固定翼/旋转翼飞机、潜艇等)的运动方式和工作流程,实现陆、海、空、潜立体化协同作战仿真。在国美调研过电商OA办公工具的开发设计、在广联达参与了BIM软件的协作开发、在书生电子独立负责过OFD版式阅读器客户端的开发、在跟谁学使用Qt WebEngine、QGraphics等主导了练习批改工具的开发,在蓝湖基于WebAssembly对标Figma参与开发了一款原型设计工具mastergo,在小米集团技术委员会承担了平台应用研发工作,目前在凌云光从事视觉相关应用平台开发。十多年的软件开发工作,让我在软件工程、程序设计、系统架构方面积累了丰富且宝贵的经验。
有同行的朋友,可以加我微信,一起进步
我叫史星亚 微信: EagleAndy  
加好友时请备注  来自qtcn
我有个Qt交友群,拉您入群
非工作时间 可以电联 18610042411
*********************************************************
另低价出售
→各种软件小程序定制!
→SAP教程,涵盖BI/SD/FICO/HANA等各种模块视频教程,购买教程,拾取金领顾问教程!
→各种考证考研题库,保证考证考研成功上岸!
→抖音快手微博朋友圈各种点赞支持,最快一分钟上万赞!
→挂机打卡,远程叫醒,等各种服务欢迎私信EagleAndy开启!
转发此内容,私信EagleAndy,有定制盲盒寄送!
离线九重水

只看该作者 2楼 发表于: 2018-05-07
离线shixingya

只看该作者 3楼 发表于: 2018-05-07
方式三 : 主要针对VS下pdb文件

#include "preheader.h"
#include "MiniDump.h"
#include <DbgHelp.h>
#include <strsafe.h>

MiniDump::MiniDump(void)
{
    SetErrorMode(SEM_FAILCRITICALERRORS);
    SetUnhandledExceptionFilter(&MiniDump::UnhandledExceptionFilter);
}


MiniDump::~MiniDump(void)
{
}


LONG WINAPI MiniDump::UnhandledExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{
    if(IsDebuggerPresent())
    {
        return EXCEPTION_CONTINUE_SEARCH;
    }

    return GenerateMiniDump(NULL, lpExceptionInfo);
}

int MiniDump::GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers)
{
    char szErrorMsg[MAX_PATH];
    StringCchPrintfA(szErrorMsg, MAX_PATH, "An unexpected error has occured: \n\nFETAL ERROR!\n\nException: 0x%08x at 0x%p\n\nPressing OK will terminate the application and save the helpful debugging information that may help us resolve this issue in the future.", pExceptionPointers->ExceptionRecord->ExceptionCode, pExceptionPointers->ExceptionRecord->ExceptionAddress);

    QMessageBox box(QMessageBox::Question,"批改系统崩溃","亲,我死了,是否生成错误报告?");
    box.setStandardButtons (QMessageBox::Ok|QMessageBox::Cancel);
    box.setDefaultButton(QMessageBox::Ok);
    box.setButtonText (QMessageBox::Ok,QString("确 定"));
    box.setButtonText (QMessageBox::Cancel,QString("取 消"));
    box.setWindowFlags(Qt::WindowStaysOnTopHint);

    if(box.exec () ==QMessageBox::Ok)
    {
        qDebug()<<"生成Dump文件中";
        BOOL bOwnDumpFile = FALSE;
        HANDLE hDumpFile = hFile;
        MINIDUMP_EXCEPTION_INFORMATION ExpParam;

        typedef BOOL (WINAPI * MiniDumpWriteDump)(
                    HANDLE,
                    DWORD ,
                    HANDLE ,
                    MINIDUMP_TYPE ,
                    PMINIDUMP_EXCEPTION_INFORMATION ,
                    PMINIDUMP_USER_STREAM_INFORMATION ,
                    PMINIDUMP_CALLBACK_INFORMATION
                    );

        MiniDumpWriteDump pfnMiniDumpWriteDump = NULL;
        HMODULE hDbgHelp = LoadLibraryA("DbgHelp.dll");
        if (hDbgHelp)
            pfnMiniDumpWriteDump = (MiniDumpWriteDump)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
        else
            MessageBoxA(NULL, "Error", "File 'DbgHelp.dll' failed to load", MB_OK | MB_ICONERROR);

        if (pfnMiniDumpWriteDump)
        {
            if (hDumpFile == NULL || hDumpFile == INVALID_HANDLE_VALUE)
            {
                char szPath[MAX_PATH] = {0};
                GetModuleFileNameA(NULL, szPath, MAX_PATH);
                char* pChar = strrchr(szPath, '\\');
                if (NULL != pChar)
                {
                    int iPos = pChar - szPath;
                    szPath[iPos + 1] = '\0';
                }

                char szFileName[MAX_PATH] = {0};
                const char* szAppName = "BIM5D Crash Report-";
                SYSTEMTIME stLocalTime;
                GetLocalTime(&stLocalTime);

                StringCchPrintfA(szFileName, MAX_PATH, "%s%s-%04d%02d%02d-%02d%02d%02d.dmp", szPath, szAppName,
                                 stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
                                 stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);

                hDumpFile = CreateFileA(szFileName, GENERIC_READ|GENERIC_WRITE,
                                        FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

                bOwnDumpFile = TRUE;
            }

            if (hDumpFile!=INVALID_HANDLE_VALUE)
            {
                ExpParam.ThreadId = GetCurrentThreadId();
                ExpParam.ExceptionPointers = pExceptionPointers;
                ExpParam.ClientPointers = FALSE;

                pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
                                     hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &ExpParam : NULL), NULL, NULL);

                if (bOwnDumpFile)
                    CloseHandle(hDumpFile);
            }
        }

        if (hDbgHelp!=NULL)
            FreeLibrary(hDbgHelp);

    }
    qDebug()<<"程序退出";
    return   EXCEPTION_EXECUTE_HANDLER;

}
本人2008年9月至2012年6月在三亚学院学习计算机科学与技术专业四年,2012年6月毕业后至今一直在北京市从事软件开发相关工作。本人的技术栈是C++、熟悉Qt、CEF框架。参与或负责过多款Windows、Linux环境下桌面软件的研发。
参加工作十年来,使用Qt参与开发过一个军工仿真想定建模工具,仿真陆、海、空潜等各兵种的作战平台(包括地面车辆、水面舰艇、固定翼/旋转翼飞机、潜艇等)的运动方式和工作流程,实现陆、海、空、潜立体化协同作战仿真。在国美调研过电商OA办公工具的开发设计、在广联达参与了BIM软件的协作开发、在书生电子独立负责过OFD版式阅读器客户端的开发、在跟谁学使用Qt WebEngine、QGraphics等主导了练习批改工具的开发,在蓝湖基于WebAssembly对标Figma参与开发了一款原型设计工具mastergo,在小米集团技术委员会承担了平台应用研发工作,目前在凌云光从事视觉相关应用平台开发。十多年的软件开发工作,让我在软件工程、程序设计、系统架构方面积累了丰富且宝贵的经验。
有同行的朋友,可以加我微信,一起进步
我叫史星亚 微信: EagleAndy  
加好友时请备注  来自qtcn
我有个Qt交友群,拉您入群
非工作时间 可以电联 18610042411
*********************************************************
另低价出售
→各种软件小程序定制!
→SAP教程,涵盖BI/SD/FICO/HANA等各种模块视频教程,购买教程,拾取金领顾问教程!
→各种考证考研题库,保证考证考研成功上岸!
→抖音快手微博朋友圈各种点赞支持,最快一分钟上万赞!
→挂机打卡,远程叫醒,等各种服务欢迎私信EagleAndy开启!
转发此内容,私信EagleAndy,有定制盲盒寄送!
快速回复
限100 字节
 
上一个 下一个