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文件》。

  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/gomen/p/3508494.html
Copyright © 2011-2022 走看看