windows程序崩溃的处理方法

本文介绍了一种在Windows程序中捕获未处理异常的方法,通过使用自定义的异常处理函数TopLevelExceptionFilter,可以输出详细的错误信息,并生成转储文件以便进一步分析程序崩溃的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

发布的Windows程序如果崩溃,可用以下代码输出错误信息并生成转储文件,以找出崩溃原因。

#ifdef _WIN32
#include <intrin.h>
#include <DbgHelp.h>
#include <Windows.h>
#include "errhandlingapi.h"
#include "minidumpapiset.h"
#include "strsafe.h"
#endif

//顶级异常处理函数
LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo)

{

//输出错误信息
TCHAR szText[1024] =  {TEXT('\0')};

StringCchPrintf(szText,
                sizeof(szText)/sizeof(szText[0]),
                TEXT("ExceptionAddress=%X, ExceptionCode=%X, ExceptionFlags=%X, 
                ExceptionInformation=%X, NumberParameters=%X"),
                ExceptionInfo->ExceptionRecord->ExceptionAddress,
                ExceptionInfo->ExceptionRecord->ExceptionCode,
                ExceptionInfo->ExceptionRecord->ExceptionFlags,
                ExceptionInfo->ExceptionRecord->ExceptionInformation,
                ExceptionInfo->ExceptionRecord->NumberParameters);

MessageBox(NULL, szText, TEXT("ExceptionFilter"), MB_OK);

//保存转储文件
char szFile[MAX_PATH];
sprintf(szFile, "mydmp%d.dmp", exe_version); 

 HANDLE hDmpFile = ::CreateFile(TEXT("./log/analysis.p"),
                                   GENERIC_READ|GENERIC_WRITE,
                                   FILE_SHARE_WRITE|FILE_SHARE_READ,
                                   0, CREATE_ALWAYS, 0, 0);

    MINIDUMP_EXCEPTION_INFORMATION stInfo = {0};
    stInfo.ThreadId = GetCurrentThreadId();
    stInfo.ExceptionPointers = ExceptionInfo;
    stInfo.ClientPointers = TRUE;

    MiniDumpWriteDump(GetCurrentProcess(),
                      GetCurrentProcessId(),
                      hDmpFile, MiniDumpNormal,
                      &stInfo, NULL, NULL);


return 0;
}


//将以下代码放置在程序入口处以捕获未处理异常
SetUnhandledExceptionFilter(TopLevelExceptionFilter);

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值