windows下qt程序崩溃后自动将程序拉起来

SetUnhandledExceptionFilter函数是Win32API的异常捕获函数,在程式异常结束前。会调用该函数注冊的回调函数,这样就能在进程终止前运行指定的代码,达到比如保存数据的功能。

当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。MSDN中描述为:

Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

 因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中启动软件可以将程序拉起来

#include <windows.h>
// 异常退出立马拉起软件
long __stdcall   CrashCallback(_EXCEPTION_POINTERS*   excp)
{

// 保存错误信息,写到文件
    CCrashStack crashStack(excp);
    QString sCrashInfo = crashStack.GetExceptionInfo();
    QString sFileName = "testcrash.log";
    QFile file(sFileName);
    if (file.open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        file.write(sCrashInfo.toUtf8());
        file.close();
    }

  // 将软件再次启动
     QProcess::startDetached(qApp->applicationFilePath(), QStringList()); // 异常退出立马将软件起来

    return EXCEPTION_EXECUTE_HANDLER;
}

其中保存错误信息的类如下:

// .h
#ifndef CCRASHSTACK_H
#define CCRASHSTACK_H
#include <windows.h>
#include <QString>


class CCrashStack
{
public:
    CCrashStack(PEXCEPTION_POINTERS pException);

    QString GetExceptionInfo();

private:
    QString GetModuleByRetAddr(PBYTE Ret_Addr, PBYTE & Module_Addr);
    QString GetCallStack(PEXCEPTION_POINTERS pException);
    QString GetVersionStr();

private:
    PEXCEPTION_POINTERS m_pException;
};

#endif // CCRASHSTACK_H

#include "ccrashstack.h"
#include <tlhelp32.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值