程序崩溃优雅退出之-SetUnhandledExceptionFilter
1.百度百科
设置异常捕获函数.
当异常没有处理的时候,系统就会调用SetUnhandledExceptionFilter所设置异常处理函数.
例如一些程序在出错的时候,会向用户报告说程序那出错就是利用这个.例如QQ..
异常处理中的一部分
当发生异常时,比如内存访问违例时,CPU硬件会发现此问题,并产生一个异常(你可以把它理解为中断)
然后CPU会把代码流程切换到异常处理服务例程。操作系统异常处理服务例程会查看当前进程是否处于调试状态
如果是,则通知调试器发生了异常,如果不是则操作系统会查看当前线程是否安装了的异常帧链(FS[0]),如果安装了SEH(try.... catch....),则调用SEH,并根据返回结果决定是否全局展开或局部展开。如果异常链中所有的SEH都没有处理此异常,而且此进程还处于调试状态,则操作系统会再次通知调试器发生异常(二次异常)。如果还没人处理,则调用操作系统的默认异常处理代码UnhandledExceptionHandler,不过操作系统允许你Hook这个函数,就是通过SetUnhandledExceptionFilter函数来设置。大部分异常通过此种方法都能捕获,不过栈溢出、覆盖的有可能捕获不到。
大部分保护壳都采用异常处理技术,跳出正常的代码指令流程,来迷惑Cracker。
2.网络文章参考:
window下使用SetUnhandledExceptionFilter捕获让程序的崩溃_bingqingsuimeng的专栏-CSDN博客_setunhandledexceptionfilter
简单使用SetUnhandledExceptionFilter()函数让程序优雅崩溃
虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束。并且发送报告,去掉了系统默认的发送报告的对话框。
所以一拍脑袋,想让自己的程序崩溃的体面一点。
自己想了大概的思路,觉得可以用一个进程来监控目标程序。的确也可以拿到了目标程序崩溃的信息,知道它什么时候崩溃的,也可以做额外的操作,但是这样是没办法把默认的发送错误的对话框去掉的。
然后又有人说是不是采用了类似钩子的方法把这个东西在哪里勾掉了。
最后网上查了一番,发现SetUnhandledExceptionFilter这个函数解决了一切。
总结了下搜到的资料,这个函数的返回值有三种情况:
EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了
EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
具体使用方法如下:
#include <windows.h> long __stdcall callback(_EXCEPTION_POINTERS* excp) { MessageBox(0,"Error","error",MB_OK); printf("Error address %x/n",excp->ExceptionRecord->ExceptionAddress); printf("CPU register:/n"); printf("eax %x ebx %x ecx %x edx %x/n",excp->ContextRecord->Eax, excp->ContextRecord->Ebx,excp->ContextRecord->Ecx, excp->ContextRecord->Edx); return EXCEPTION_EXECUTE_HANDLER; }int main(int argc,char* argv[]) { SetUnhandledExceptionFilter(callback); _asm int 3 //只是为了让程序崩溃return 0; }
3.实践使用
使用环境 VS2015 QT5.51 客户端程序
LONG WINAPI catchExceptionFileter(_EXCEPTION_POINTERS* pExceptionInfo)
{//获取pExceptionInfo中的异常信息,详情查阅_EXCEPTION_POINTERS定义//其它自定义处理(弹窗,打报告,日志等)
}int main(int argc,char *argv[])
{//程序其他操作//异常检测获取LPTOP_LEVEL_EXCEPTION_FILTERpException=SetUnhandledExceptionFilter(catchExceptionFileter);_asm int 3 //只是为了让程序崩溃
}
程序崩溃优雅退出之-SetUnhandledExceptionFilter相关推荐
- java kill 进程 时间_kill及kill-9的用法及如何实现进程的优雅退出
JAVA架构师Ya七月 2019-08-19 1. kill与signals 我们这里所说的kill是指作为shell command的那个kill(相对地,linux系统中还有个叫做kill的sys ...
- Golang信号处理和优雅退出守护进程
Golang中的信号处理 信号类型 个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令 man signal 提供了官方的信号介绍. ...
- linux进程优雅退出,Go 的信号处理和优雅退出
每个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令man 7 signal提供了官方的信号介绍. 在POSIX.1-1990标准中 ...
- [异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题
[异常退出,错误代码0xC0000005]:解决Windows应用程序崩溃的问题 每当我们在使用Windows上的应用程序时,突然遇到了程序崩溃显示"[异常退出,错误代码0xC0000005 ...
- 程序退出代码0xC0000005,你的程序崩溃了吗?
程序退出代码0xC0000005,你的程序崩溃了吗? 在编程的过程中,我们难免遇到一些意料之外的错误.其中一个常见的错误就是程序崩溃并出现"程序退出代码0xC0000005"的提示 ...
- MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈
MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈 2013-09-11 09:39:04| 分类: VS编译集合|举报|字号 订阅 下载LOFTER 我的照片书 | http://blog.c ...
- windows程序崩溃调试终极武器
windows程序崩溃调试终极武器---dump文件 一.前言 前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果 ...
- 软件崩溃时 将堆栈信息写入dump文件, 并使用VS2010定位程序崩溃位置
Windows下有三种生成dump文件的方式: 1.通过任务管理器和注册表:2.WinDbg抓取:3.程序中加入存储Dump的代码 具体生成方法参看:Windows下dump文件生成与分析 本文详细介 ...
- 关于Windows程序崩溃(Crash)以及生成dump文件的探究
文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...
- Linux下程序崩溃dump时的 core文件的使用方法
Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...
最新文章
- 2、Reactive Extensions for .NET(译)
- python 项目构建工具_python的构建工具setup.py
- 【Linux 内核 内存管理】内存管理架构 ④ ( 内存分配系统调用过程 | 用户层 malloc free | 系统调用层 brk mmap | 内核层 kmalloc | 内存管理流程 )
- Linux系统基础网络配置老鸟精华篇
- spi四种工作模式时序图_SPI总线协议及SPI时序图详解
- 黄金寨景区、缥缈间温泉2019北京推介会成功举办
- Android移植的Box2D
- 使用负边距创建自适应宽度的流体布局
- python xlutils和openpyxl哪个好_Python-Excel 模块哪家强?
- pytorch学习笔记(三十):RNN反向传播计算图公式推导
- cadence17.4 设计PCB零基础教程入门学习过程
- 长尾关键词生成工具-长尾关键词生成软件免费-关键词组合工具
- eXtremeComponents使用总结--1(转载)
- Rosetta Stone罗塞塔石碑学习语言Win+Mac最新v5.0.37完美破解版+全语言包
- python操作系统存储管理作业答案_操作系统课后题答案一
- 克隆硬盘后进不去系统_硬盘GHOST克隆后,为什么新的硬盘系统启动不了?
- [附源码]计算机毕业设计JAVA景区门票系统
- servlet实现统计网站访问量
- 分享前端网站模板,HTML5的响应式设计模板
- 小程序获取用户微信步数