原文:http://blog.csdn.net/zhengguodun/article/details/5483203
虽然是大公司的产品,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;
}
成功以后,去翻了下windows核心编程,发现里面已经有提到了这个函数了。只是由于学艺不精,暂时没有去拜读这么高深的书。所以一直不知道。
问了下同事,发现他立马说出了可以用这个函数(说个大概的函数名)来实现,并且提出在win32下是可以的,但是在MFC可能捕获不到这个异常。认为MFC下有自己的一套机制来解决。
后来我半信半疑,在MFC下一试,竟然可以o(∩_∩)o...
并且我是在一个MDI程序下的一个DLL中发生的一个异常,竟然也掉近了回调函数,心理暗爽啊。
然后又在一个出错的控件中试了一下,竟然控件的错误也能捕获到。怎一爽字了得!
本文参考了如下两文章,红色部分为引用如下文章:
http://www.anqn.com/jiamijiemi/xitongdiceng/2007-09-27/a0987174.shtml
http://topic.csdn.net/t/20040727/13/3214397.html
SetUnhandledExceptionFilter在debug模式下不会生效,原因如下:
http://support.microsoft.com/kb/173652
相关推荐
调试Relese 程序崩溃的神器, 使用 SetUnhandledExceptionFilter 接口生成 Mini-dump文件, 再将生成的dmp文件发送给目标邮件, 分别使用C/C++两种方式解决问题, 邮件使用smtp协议, 支持代理功能, 用QQ邮箱测试正常.
本文介绍了SetUnhandledExceptionFilter与CRT一起使用的修复程序。
异常捕获函数的使用规则,上传上来供大家学习参考!
SetUnhandledExceptionFilter的c++代码
程序在debug可以正常运行,但是在release版后异常结束,系统又没有提供任何信息情况下,或者程序发布后在客户手中出现异常崩溃,但自己测试又不能复现问题,要是能捕获到异常时相关信息就很好定位问题了。...
启动时,dumper使用其命令行中的进程和线程ID打开崩溃程序的句柄。 然后,它使用对ReadProcessMemory的一些调用来获取转储程序的异常指针和上下文记录。 然后,它将使用此上下文记录来设置原始堆栈帧,并开始使用...
在win7系统下,通过SetUnhandledExceptionFilter...但在win8、win10系统SetUnhandledExceptionFilter(即使hook)也已经无法捕获一些特殊的异常,因此使用注册表的aedebug是最通用的方法;该工具简化的dump获取的方式
4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...
在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了。目前有一些方法可以解决:崩溃地址 + MAP文件;MAP文件;...
易语言程序异常处理源码,程序异常处理,异常处理子程序,信息框_,SetUnhandledExceptionFilter,EXCEPTION_RECORD,CONTEXT,EXCEPTION_POINTERS
SetUnhandledExceptionFilter
通过【NSSetUncaughtExceptionHandler】机制捕获处理app的异常
4. RDTSC/ GetTickCount时间敏感程序段 6 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 9 8. DebugPort: CheckRemoteDebuggerPresent()/...
4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...
4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...
4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...
易语言SEH反调试源码,SEH反调试,MyUnhandledExceptionFilter,SetUnhandledExceptionFilter
4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...
易语言设置内存断点源码,设置内存断点,DebugEip,DebugRetn,GetDebugInfo,SetUnhandledExceptionFilter,SuspendThread,RtlMoveMemory_EXCEPTION_RECORD
(1)C++异常一、 综述我很少敢为自己写的东西弄个详解的标题,之所以这次敢于...实现难度并不大,无非就是调用了SetUnhandledExceptionFilter等函数,让windows在出现未处理异常时让自己的回调函数接管操作,然后利用其