zoukankan      html  css  js  c++  java
  • [转]让程序在崩溃时体面的退出之SEH+Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6649605

             在我上篇文章《让程序在崩溃时体面的退出之SEH》中讲解了SEH中try/except可以捕捉异常,避免程序的崩溃,并且可以在处理完异常之后,还能决定进该进程如何执行。对于应用程序的使用者来说,并不知道异常的发生。但是对于软件的开发者来说,虽然避免了程序的崩溃,可是这样可以让程序崩溃的缺陷存在于代码中,就像一个定时炸弹,不知道什么时候会爆炸。要想修复这样的缺陷,首先要找到导致程序崩溃的那行代码。而我在我的那篇《让程序在崩溃时体面的退出之Dump文件》里面介绍了如何用Dump文件来定位使程序崩溃的代码。这里依然可以用同样的方法。下面就是创建Dump文件的函数。

    [cpp] view plaincopy
     
    1. // 创建Dump文件  
    2. //   
    3. void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)  
    4. {  
    5.     // 创建Dump文件  
    6.     //  
    7.     HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
    8.   
    9.     // Dump信息  
    10.     //  
    11.     MINIDUMP_EXCEPTION_INFORMATION dumpInfo;  
    12.     dumpInfo.ExceptionPointers = pException;  
    13.     dumpInfo.ThreadId = GetCurrentThreadId();  
    14.     dumpInfo.ClientPointers = TRUE;  
    15.   
    16.     // 写入Dump文件内容  
    17.     //  
    18.     MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);  
    19.   
    20.     CloseHandle(hDumpFile);  
    21. }  

           从上面的代码中可以看出,要想创建Dump文件,必须得到一个指向EXCEPTION_POINTERS结构的指针。怎么在try/except块中得到这个指针呢?这个时候就需要用到Windows API中的GetExceptionInformation()。这个函数的返回值就是一个指向EXCEPTION_POINTERS结构的指针。下面是具体的代码。

    [cpp] view plaincopy
     
    1. // 作为except块中表达式的函数  
    2. //  
    3. LONG CrashHandler(EXCEPTION_POINTERS *pException)  
    4. {     
    5.     // 在这里添加处理程序崩溃情况的代码  
    6.     //  
    7.   
    8.     // 这里以弹出一个对话框为例子  
    9.     //  
    10.     MessageBox(NULL, _T("Message from Catch handler"), _T("Test"), MB_OK);  
    11.   
    12.     // 创建Dump文件  
    13.     //  
    14.     CreateDumpFile(_T("C:\Test.dmp"), pException);  
    15.   
    16.     return EXCEPTION_EXECUTE_HANDLER;  
    17. }  
    18.   
    19. int _tmain(int argc, _TCHAR* argv[])  
    20. {  
    21.     __try  
    22.     {  
    23.         MessageBox(NULL, _T("Message from '__try' section"), _T("Test"), MB_OK);  
    24.   
    25.         // 除零,人为的使程序崩溃  
    26.         //  
    27.         int i = 13;  
    28.         int j = 0;  
    29.         int m = i / j;  
    30.     }  
    31.     // 捕捉到让程序崩溃的异常时创建Dump文件  
    32.     //  
    33.     __except(CrashHandler(GetExceptionInformation()))  
    34.     {  
    35.         // 这里以弹出一个对话框为例子  
    36.         //  
    37.         MessageBox(NULL, _T("Message from '__except' section"), _T("Test"), MB_OK);  
    38.     }  
    39.   
    40.     MessageBox(NULL, _T("Funcation completed"), _T("Test"), MB_OK);  
    41.   
    42.     return 0;  
    43. }  

            编译上面的代码并运行,会依次弹出下面这些对话框,并在C盘创建一个Dump文件Test.dmp。

            有了Dump文件,就可以轻松定位使程序崩溃的那行代码,具体方法可参考我的《让程序在崩溃时体面的退出之Dump文件》。

  • 相关阅读:
    js代码中引入其他js文件
    SQL Server 创建跨库查詢、修改、增加、删除
    将SQL Server查询导出本地excel(mail发送)
    SQL Server2008 xp_cmdshell啟用
    SQL Server存储过程邮件发送以表格方式发送
    SQL Server2008进程堵塞处理方法
    sql 上舍下舍運用
    怎樣添加設置GridView,CheckBox全選功能
    点击 Button触发事件将GridView1 CheckBox勾选的行添加到GridView2中
    ES6-Proxy,代理
  • 原文地址:https://www.cnblogs.com/gomen/p/3508494.html
Copyright © 2011-2022 走看看