首页 > 编程知识 正文

seh 异常,seh异常处理

时间:2023-05-03 23:17:47 阅读:194316 作者:1791

1.VEH (向量异常)

// VEH: 向量化异常处理的一种,被保存在一个全局的链表中,进程内的所有线程都可

//  以使用这个函数,是第一个处理异常的函数。

异常处理函数:

LONG NTAPI AddVectoredExceptionHandler(

  _In_UlON First,

异常处理函数被调用的顺序

  _In_PVECTORED_EXECUTE_HANDLER Handler

异常处理回调函数

  )

 AddVectoredExceptionHandler(TRUE, VectorExceptionHandler);

回调函数的两个返回值:

EXCEPTION_CONTINUE_EXECUTION(-1)  :继续执行

EXCEPTION_CONTINUE_SEARCH(0)      :继续搜索

 

2.SEH

//结构化异常处理一般有下面3个部分组成:

//1. 保护代码体

//2. 过滤表达式

//3. 异常处理块

//其中保护代码体:是指有可能发生异常的代码,一般在SEH中是用__try{}包含的那部分

__try  __leave  __finally  组合

终止处理器:AbnormalTermination   确定函数离开是正常还是非正常

__try   __cdcept(过滤表达式 3个)

    //EXCEPTION_EXECUTE_HANDLER     执行except中的代码,不再回去执行了

    //EXCEPTION_CONTINUE_SEARCH     我处理不了,别人处理,

    //EXCEPTION_CONTINUE_EXECUTION  我已经处理完了,可以继续执行了

两个函数:GetExceptionCode()            //会返回一个异常码

GetExceptionInformation()                  //获取上下文,错误信息执行环境  可修改寄存器值

 

3.UEH (未处理异常的最终处理)

// UEH: 全称顶层异常处理器,这个函数只能有一个,被保存在全局变量中,

// 由于只会被系统默认的最底层 SEH 调用,所以又会被称作是 SEH 的一

// 种,是整个异常处理中的最后一环,所以通常都不会再次执行异常处理操

// 作,而是进行内存 dump,将信息发送给服务器,进行异常的分析。

// [注意: UEH 在 win7 之后,只有在非调试模式下才会被调用,可以反调试]

LONG WINAPI TopLevelHandle(_EXCEPTION_POINTERS* ExceptionInfo)

{

//奔溃前的提醒工作

    MessageBox(0, L"程序即将崩溃", L"提示", 0);

    return EXCEPTION_CONTINUE_SEARCH;

}

​​​​​​​

// 通过一个函数可以直接的安装 UEH

SetUnhandledExceptionFilter(TopLevelExceptionFilter);

4.VCH (向量异常)

// 异常的传递过程: VEH -> SEH -> UEH -> VCH

// VCH: 和 VEH 类似,但是只会在异常被处理的情况下最后调用

LONG WINAPI VectoredContinueHandler(EXCEPTION_POINTERS* ExceptionInfo)

{

// VEH 不会对异常进行处理,调用的时机和异常处理的情况有关

printf("VCH: ExceptionCode: %Xn", ExceptionInfo->ExceptionRecord->ExceptionCode);

returnEXCEPTION_CONTINUE_SEARCH;

}

// 通过一个函数可以直接的安装 VCH,参数一是布尔值,如果为 TRUE

//  的话,就将当前的函数添加到全局 VEH 函数的链表头部,否则尾部

 SetUnhandledExceptionFilter(TopLevelExceptionFilter);

5.windows 异常处理中VEH、SEH、UEH、VCH 之间的关系
        1.当异常交由用户处理时,按照以下顺序调用异常处理方式VEH-〉SEH-〉VCH 。
        2.当VEH表示处理了异常,就不会传递给SEH,但是会传递异常给VCH 。
        3.当VEH没有处理了,就会传递给SEH。
        4.当SEH的所有异常处理函数没能够处理异常,会调用默认的SEH(就是UEH,只是方式属于SEH)处理函数。
        5.当SEH处理了异常,从 except 开始执行,就不会再将异常传递给VCH 。
        6.当SEH返回异常产生处执行,在返回之前会调用VCH 。
注意!!!在 *unix 中是用信号来处理的。所以如果要做到兼容(像编译器必须实现俩种方式)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。