vs20008+qt4.8.4生成Dump文件并调试

一、捕捉异常生成Dump文件

#include <QtGui/QApplication>
#include <QString>
#include <QTime>
#include <QDir>
#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")

LONG WINAPI SystemExceptionCall(_EXCEPTION_POINTERS* ExceptionInfo)
{
    // 获取生成路径
    QString logFile =  "./";
    // 判断路径是否存在
    if (!QDir(logFile).exists())
    {
        // 路径不存在则创建
        QDir().mkpath(logFile);
    }

    // 生成dump文件路径及名称
    QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyyMMdd-hh_mm_ss"));
    // 创建dump文件
#if 1
    // 使用CreateFile创建Dump文件,适用于包含详细参数的文件创建
    HANDLE hDumpFile = CreateFile(dumpName.toStdWString().c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#else
    // Pdb文件的配置参数(如文件显隐,编辑状态等)
    LPCREATEFILE2_EXTENDED_PARAMETERS fileParam = NULL;
    // 使用CreateFile2创建Dump文件,适用于普通文件创建,通常不需要其他配置参数使用该函数更为快捷
    HANDLE hDumpFile = CreateFile2(dumpName.toStdWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, fileParam);
#endif
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ThreadId = GetCurrentThreadId();   // 当前线程Id
        dumpInfo.ExceptionPointers = ExceptionInfo; // 当前异常指针
        dumpInfo.ClientPointers = TRUE; // 写入Dump文件时,可以直接引用相关内存地址
        // 创建Dump文件
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &dumpInfo, NULL, NULL);
        // 关闭文件句柄
        CloseHandle(hDumpFile);
    }
    return EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)SystemExceptionCall);

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

 二、调试Dump文件

1、将生成的dump文件和pdb文件放在同一目录下 

2、用vs打开dump文件

点击启动调试即可

三、 一些疑问

在测试时,写了除零和数组越界,除零是可以生成dump文件,但是数组越界导致的程序崩溃没有生成dump文件是怎么回事???有人可以解答一下吗

另外windows本身会生成dump文件,上述的两种异常都可以生成,路径如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值