C++ 应用处理异常崩溃(转载)

Posted 这么近_那么远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不能抓到,例如刚开始的一些初始化信息时的异常,不过大部分还是可以的

会提供小小的帮助。

 

以上是关于C++ 应用处理异常崩溃(转载)的主要内容,如果未能解决你的问题,请参考以下文章

C++学习39 异常处理入门(try和catch)

try{}catch理解 (转载)

SocketTimeoutException 使应用程序崩溃

Android - 应用程序启动时片段 onCreate 崩溃

Android 应用程序片段不断崩溃

在片段内使用 GridView 时应用程序崩溃