在我的上篇文章《
让程序在崩溃时体面的退出之SEH+Dump文件》我介绍了怎样用SEH加上Dump文件来避免程序的崩溃并在程序崩溃时创建Dump文件来帮助定位出现异常的代码行。可是只有try/except块中try块中的代码出现异常才能被捕捉到,try块外面的代码出现异常,程序照样会崩溃。
下面用《
让程序在崩溃时体面的退出之SEH+Dump文件》文中的代码为例子来说明。
编译上面的代码并运行,会依次弹出下面这些对话框,并在C盘创建一个Dump文件Test.dmp。
如果把上面代码中的main()函数改成下面的样子,运行编译后的程序依然会崩溃。
这种情况在实际编程中是很有可能出现的,毕竟我们不可能事先预计到所有可能出现导致程序崩溃的情况,并把这些代码放到try/except块中。那么对于这些不可预知的异常该怎么办呢?这就要用到我那篇《让程序在崩溃时体面的退出之Unhandled Exception》中的方法:用Windows API中的SetUnhandledExceptionFilter设置一个回调函数来处理这些无法预料的异常。下面是在上面的例子代码上修改后的代码。其中函数CreateDumpFile没有任何变化。
编译上面的代码,运行生成的EXE文件,可以看到在弹出上面提到的那一系列的对话框后,程序正常退出,没有崩溃。同时,在C盘下生成了2个Dump文件,文件名指出了发生异常的时刻。
上面的代码仅仅是为了说明怎样配合使用SEH和SetUnhandledExceptionFilter,所以except后的表达式和SetUnhandledExceptionFilter中所设置的回调函数都使用了同一个函数CrashHandler。在实际的应用中可以根据不同的需求而使用不同的函数。这个函数的参数必须是一个指向EXCEPTION_POINTERS的指针,返回值必须是这3个中的一个:EXCEPTION_CONTINUE_SEARCH,EXCEPTION_CONTINUE_EXECUTION,EXCEPTION_EXECUTE_HANDLER。这3个值的具体含义可以查阅MSDN或者我的那篇《让程序在崩溃时体面的退出之SEH》。
实际情况下,是不应该用同一个回调函数的。因为在except表达式中的函数是处理try块中的代码异常的;而用SetUnhandledExceptionFilter设置的回调函数是用来处理代码中没有被捕捉到的异常的。对于未被捕捉到的异常,这个回调函数是不知道异常发生的地方的,虽然可以通过异常代码知道异常的类型,但是由于不知道是什么状况引起的异常,所以没法做出相应的异常处理。一般情况下,这个回调函数是应用程序崩溃前的最后一道防线,这个函数中的代码被执行完后,应用程序就会被终止。所以,大部分的应用程序,在这个函数里都是弹出一个发送错误报告的对话框,来告诉用户程序发生异常,需要终止,可以把错误报告(一般是包括Dump文件和一些必要的文本信息)发送到指定地方帮助开发者来修改代码缺陷,以提高软件质量。
使用上面的方法编写出的应用程序不会崩溃,并且在出现异常的时候会产生Dump文件。程序的使用者会获得非常良好的用户体验。如果再给应用程序添加上Log信息,配合上Dump文件,就可以很轻松的定位程序中的异常,帮助开发者快速的修复代码中的错误。
分享到:
相关推荐
捕获C++程序中的SEH异常,生成程序崩溃时的dump文件。dump文件可用于程序release版本的崩溃定位。
离线MinGW-W64 GCC-8.1.0 (seh版本+sjlj版本) 1.解压 2.配置环境变量,将bin文件目录添加值环境变量 3.测试 : cmd 中输入 “gcc -v”
SEH CHAIN Exception Example
seh异常处理练习的程序,里面的程序里面用了SEH,并且SEH函数中有简单的反调试代码.通过调试此程序可更好的理解SEH和动态反调试
西门子 SEH62.1时控开关设置说明
SEH方案
支持易语言程序代码自设SEH捕获异常
c# iocp完成端口 高并发服务器 + log4net日志 + SEH异常捕获 本人已搭建好 你们拿走就直接能用了。。
这篇文章描述的是捕获和处理运行在...这篇文章附带了一个小控制台程序ExceptionHandler作为例子,这一个例子能产生和捕获各种不同的异常,并且能生成一个崩溃时的Dump文件,通过这个文件你可以定位到出错的代码行。
seh 调试 反调试 破解 代码 SEH反调试的实现与调试 在没有异常时永远都是错误的注册码,只有当触发异常时,程序才走到注册成功的地方…
SEH反调试.rar
程序发生错误 找不到 libcc_s_seh-1.dll,安装该 dll 后,重新运行即可
无法定位程序输入点 gxx_personality_v0、gxx_personality_seh0操作方式:手动复制安装目录的 libstdc++-6.dll 文件 (覆盖)
SEH异常处理.rar
C++异常和SEH的区别,入门级的设计模式,大家可以参考下
易语言SEH异常处理源码.rar
[易语言源码]-高效线程SEH示例源码
qt编译运行找不到 libgcc-s-seh-1.dll
C++ SEH HOOK拦截任意API 1G视频教程
SEH异常处理结合花指令