zoukankan      html  css  js  c++  java
  • C++ 应用处理异常崩溃(转载)

    有时,在我们的程序运行的时候,会遇到一些崩溃问题,尤其是概率出现的时候,如果能捕获其异常,那么对于我们快速定位bug是很有帮助的

    这里借用网上搜寻回来的函数,记录一下:

    头文件及库:

    1 #include <dbghelp.h>
    2 #pragma comment ( lib, "dbghelp.lib" )
     1 wstring GetPresentTime()  
     2 {  
     3     SYSTEMTIME time;  
     4     GetLocalTime(&time);   
     5 
     6     TCHAR wszTime[128];  
     7     swprintf_s(wszTime, _T("%04d-%02d-%02d %02d-%02d-%02d-%03d"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);  
     8 
     9     return wstring(wszTime);  
    10 }  
    11 
    12 void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)  
    13 {  
    14     // 创建Dump文件  
    15     //  
    16     HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
    17 
    18     // Dump信息  
    19     //  
    20     MINIDUMP_EXCEPTION_INFORMATION dumpInfo;  
    21     dumpInfo.ExceptionPointers = pException;  
    22     dumpInfo.ThreadId = GetCurrentThreadId();  
    23     dumpInfo.ClientPointers = TRUE;  
    24 
    25     // 写入Dump文件内容  
    26     //  
    27     MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);  
    28 
    29     CloseHandle(hDumpFile);  
    30 }  
    31 
    32 LONG CallBackCrashHandler(EXCEPTION_POINTERS *pException)  
    33 {   
    34     MessageBox(NULL,L"你的程序 遇到一个错误,已停止运行,请重新启动",L"错误",MB_OK);
    35     
    36     // 以当前时间为文件名  
    37     //  
    38     TCHAR szModuleDir[128];
    39     DWORD dwLength=GetModuleFileName(NULL,szModuleDir,128);
    40 
    41     for(DWORD dw=dwLength-1;dw>0;dw--)
    42     {
    43         if(szModuleDir[dw]=='\')
    44         {
    45             szModuleDir[dw+1]=0;
    46             break;
    47         }
    48     }
    49 
    50     wstring strDumpFileName = szModuleDir + GetPresentTime() +_T(".dmp");  
    51 
    52     // 创建Dump文件  
    53     //  
    54     CreateDumpFile(strDumpFileName.data(), pException); 
    55 
    56     return EXCEPTION_EXECUTE_HANDLER;  
    57 }  

    调用:

    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CallBackCrashHandler);

    也许有些bug不能抓到,例如刚开始的一些初始化信息时的异常,不过大部分还是可以的

    会提供小小的帮助。

  • 相关阅读:
    Mysql日志管理
    Mysql 安全和DCL语句
    Mysql DDL语句之视图
    Mysql增删改查(DML、DQL)
    Mysql操作之部分DDL语句
    如何做事情
    temp
    asp.net入门
    希望尽快回忆起来
    需求?
  • 原文地址:https://www.cnblogs.com/george-cw/p/5305641.html
Copyright © 2011-2022 走看看