[转]让程序在崩溃时体面的退出之SEH+Dump文件
原文地址:http://blog.csdn.net/starlee/article/details/6649605
在我上篇文章《让程序在崩溃时体面的退出之SEH》中讲解了SEH中try/except可以捕捉异常,避免程序的崩溃,并且可以在处理完异常之后,还能决定进该进程如何执行。对于应用程序的使用者来说,并不知道异常的发生。但是对于软件的开发者来说,虽然避免了程序的崩溃,可是这样可以让程序崩溃的缺陷存在于代码中,就像一个定时炸弹,不知道什么时候会爆炸。要想修复这样的缺陷,首先要找到导致程序崩溃的那行代码。而我在我的那篇《让程序在崩溃时体面的退出之Dump文件》里面介绍了如何用Dump文件来定位使程序崩溃的代码。这里依然可以用同样的方法。下面就是创建Dump文件的函数。
- // 创建Dump文件
 - //
 - void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
 - {
 - // 创建Dump文件
 - //
 - HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 - // Dump信息
 - //
 - MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
 - dumpInfo.ExceptionPointers = pException;
 - dumpInfo.ThreadId = GetCurrentThreadId();
 - dumpInfo.ClientPointers = TRUE;
 - // 写入Dump文件内容
 - //
 - MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
 - CloseHandle(hDumpFile);
 - }
 
从上面的代码中可以看出,要想创建Dump文件,必须得到一个指向EXCEPTION_POINTERS结构的指针。怎么在try/except块中得到这个指针呢?这个时候就需要用到Windows API中的GetExceptionInformation()。这个函数的返回值就是一个指向EXCEPTION_POINTERS结构的指针。下面是具体的代码。
- // 作为except块中表达式的函数
 - //
 - LONG CrashHandler(EXCEPTION_POINTERS *pException)
 - {
 - // 在这里添加处理程序崩溃情况的代码
 - //
 - // 这里以弹出一个对话框为例子
 - //
 - MessageBox(NULL, _T("Message from Catch handler"), _T("Test"), MB_OK);
 - // 创建Dump文件
 - //
 - CreateDumpFile(_T("C:\\Test.dmp"), pException);
 - return EXCEPTION_EXECUTE_HANDLER;
 - }
 - int _tmain(int argc, _TCHAR* argv[])
 - {
 - __try
 - {
 - MessageBox(NULL, _T("Message from '__try' section"), _T("Test"), MB_OK);
 - // 除零,人为的使程序崩溃
 - //
 - int i = 13;
 - int j = 0;
 - int m = i / j;
 - }
 - // 捕捉到让程序崩溃的异常时创建Dump文件
 - //
 - __except(CrashHandler(GetExceptionInformation()))
 - {
 - // 这里以弹出一个对话框为例子
 - //
 - MessageBox(NULL, _T("Message from '__except' section"), _T("Test"), MB_OK);
 - }
 - MessageBox(NULL, _T("Funcation completed"), _T("Test"), MB_OK);
 - return 0;
 - }
 
编译上面的代码并运行,会依次弹出下面这些对话框,并在C盘创建一个Dump文件Test.dmp。




有了Dump文件,就可以轻松定位使程序崩溃的那行代码,具体方法可参考我的《让程序在崩溃时体面的退出之Dump文件》。
[转]让程序在崩溃时体面的退出之SEH+Dump文件的更多相关文章
- [转]让程序在崩溃时体面的退出之SEH
		
原文地址:http://blog.csdn.net/starlee/article/details/6636723 SEH的全称是Structured Exception Handling,是Wind ...
 - [转]让程序在崩溃时体面的退出之Dump文件
		
原文地址:http://blog.csdn.net/starlee/article/details/6630816 在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在 ...
 - [转]让程序在崩溃时体面的退出之CallStack
		
原文地址:http://blog.csdn.net/starlee/article/details/6618849 在我的那篇<让程序在崩溃时体面的退出之Unhandled Exception& ...
 - 让程序在崩溃时体面的退出之Dump文件
		
在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但 ...
 - [转]让程序在崩溃时体面的退出之Unhandled Exception
		
原文地址:http://blog.csdn.net/starlee/article/details/6613424 程序是由代码编译出来的,而代码是由人写的.人非圣贤,孰能无过.所以由人写的代码有缺陷 ...
 - 获取崩溃时的调用栈和生成dump文件,然后自动重启
		
首先要说明的是: linux 下 比较方便可以得到 崩溃时的调用栈,win下 比较难办 1. linux 获取调用栈 代码奉上: #include <execinfo.h> //在头 ...
 - 编写的windows程序,崩溃时产生crash dump文件的办法
		
一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...
 - C#程序保存dump文件
		
作用 程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析. 辅助类代码 using System; using System.Diagnostics; using S ...
 - android在程序崩溃时Catch异常并处理
		
Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...
 
随机推荐
- asp.net - GridView根据linkButton值不同跳转不同页面
			
一,当前页面中,前台界面的主要代码: <asp:TemplateField HeaderText="姓名"> <ItemTemplate> <!--根 ...
 - mysql的账户失效,之前的密码无法登录
			
引用自:http://blog.sina.com.cn/s/blog_682c287b0100ofz8.html 此为linux服务器下的做法 方法一: 1.关闭mysql # service ...
 - oracle sql语句
			
一.ORACLE的启动和关闭1.在单机环境下要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下su - oracle a.启动ORACLE系统oracle>svrmgrlSVRM ...
 - tableview 在ios8上面分割线不全的问题
			
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath ...
 - ios开发中MVC模式的理解
			
MVC是80年代出现的一种软件设计模式,是模型(model),视图(view)和控制(Controller)的缩写. 其中Model的主要功能包括业务逻辑的处理以及数据的访问,这是应用程序的主体部分. ...
 - 菜鸟日记之JSP二 内置对象的理解
			
·最近学习JSP了,对编程和网络又有了一些理解.无论是现实中人与人的交流,还是网络世界的接触,都是在相互表达自己的意思让别人知道,并理解对方的信息.然后我们知道的事情不断的变多,会又交杂出新的内容,不 ...
 - [Introduction to programming in Java 笔记] 1.3.9 Factoring integers 素因子分解
			
素数 A prime is an integer greater than one whose only positive divisors are one and itself.整数的素因子分解是乘 ...
 - Data Abstraction
			
What is an object? (Page 238) In C++, an object is just a variable, and the purest definition is &qu ...
 - (转)log4j日志级别设置成DEBUG时输出Html代码等问题:
			
log4j日志级别设置成DEBUG时输出Html代码等问题: 问题: log4j日志级别设置成DEBUG时会输出很多信息,包括一些Html代码 解决方案: log4j的控制是树形,所以在log4j.p ...
 - WF学习笔记(二)
			
-DoWhile循环:当[Condition]条件为真时会执行[Body]中的内容, 当[Condition]条件为假时会执行[Body]中的内容一次 -ForEach<T> 循环 :[V ...