电竞比分网-中国电竞赛事及体育赛事平台

分享

使用SetUnhandledExceptionFilter讓程序優(yōu)雅的崩潰

 tianht 2016-05-31

雖然是大公司的產(chǎn)品,QQ它還是會在我們的折騰下崩潰的,但是它總是崩潰的很優(yōu)雅,還要彈出自己的對話框來結(jié)束。并且發(fā)送報告,去掉了系統(tǒng)默認的發(fā)送報告的對話框。

所以一拍腦袋,想讓自己的程序崩潰的體面一點。

自己想了大概的思路,覺得可以用一個進程來監(jiān)控目標程序。的確也可以拿到了目標程序崩潰的信息,知道它什么時候崩潰的,也可以做額外的操作,但是這樣是沒辦法把默認的發(fā)送錯誤的對話框去掉的。

然后又有人說是不是采用了類似鉤子的方法把這個東西在哪里勾掉了。

最后網(wǎng)上查了一番,發(fā)現(xiàn)SetUnhandledExceptionFilter這個函數(shù)解決了一切。

總結(jié)了下搜到的資料,這個函數(shù)的返回值有三種情況:

 

EXCEPTION_EXECUTE_HANDLER equ 1 表示我已經(jīng)處理了異常,可以優(yōu)雅地結(jié)束了  
EXCEPTION_CONTINUE_SEARCH equ 0 表示我不處理,其他人來吧,于是windows調(diào)用默認的處理程序顯示一個錯誤框,并結(jié)束  
EXCEPTION_CONTINUE_EXECUTION equ -1 表示錯誤已經(jīng)被修復(fù),請從異常發(fā)生處繼續(xù)執(zhí)行 

 

具體使用方法如下:

 

  #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核心編程,發(fā)現(xiàn)里面已經(jīng)有提到了這個函數(shù)了。只是由于學(xué)藝不精,暫時沒有去拜讀這么高深的書。所以一直不知道。

問了下同事,發(fā)現(xiàn)他立馬說出了可以用這個函數(shù)(說個大概的函數(shù)名)來實現(xiàn),并且提出在win32下是可以的,但是在MFC可能捕獲不到這個異常。認為MFC下有自己的一套機制來解決。

后來我半信半疑,在MFC下一試,竟然可以o(∩_∩)o...

并且我是在一個MDI程序下的一個DLL中發(fā)生的一個異常,竟然也掉近了回調(diào)函數(shù),心理暗爽啊。

然后又在一個出錯的控件中試了一下,竟然控件的錯誤也能捕獲到。怎一爽字了得!

本文參考了如下兩文章,紅色部分為引用如下文章:

http://www./jiamijiemi/xitongdiceng/2007-09-27/a0987174.shtml

http://topic.csdn.net/t/20040727/13/3214397.html


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多