中断和异常

硬件或操作系统所指的中断和异常

a) 这种情况是,线程先注册一个中断处理函数,当特定的事件发生时,由硬件或操作系统调用中断处理函数,执行完中断处理函数后,线程继续执行中断或异常发生时的指令

b) 中断与异常的区别:

按《软件调试》(张银奎著)的说法,中断是由硬件产生的,异常是由软件产生的

c) X86架构下的IDTLinux下的信号(signal)机制,Windows下的异常机制(向量化异常处理,结构化异常处理),都提供这种功能——自动调用中断处理函数,自动恢复到中断或异常发生时的状态

Windows异常处理机制

RaiseException

1.硬件或软件产生异常

2.Windows调用KiDispatchException分发异常

KiDispatchException

{

一轮:调试器、RtlDispatchException

二轮:调试器

}

RtlDispatchException

{

首先找VEH(向量化异常处理函数)

//VEH所需数据在堆中

其次找SEH(结构化异常处理函数)

//SEH所需数据栈中

}

VEH

PVOID WINAPI AddVectoredExceptionHandler(

__in  ULONG FirstHandler,

__in  PVECTORED_EXCEPTION_HANDLER VectoredHandler

);

ULONG WINAPI RemoveVectoredExceptionHandler(

__in  PVOID Handler

);

LONG CALLBACK VectoredHandler(

__in  PEXCEPTION_POINTERS ExceptionInfo

);

typedef struct _EXCEPTION_POINTERS {  PEXCEPTION_RECORD ExceptionRecord;  PCONTEXT ContextRecord;

} EXCEPTION_POINTERS,  *PEXCEPTION_POINTERS;

typedef struct _EXCEPTION_RECORD {  DWORD ExceptionCode;  DWORD ExceptionFlags;  struct _EXCEPTION_RECORD* ExceptionRecord;  PVOID ExceptionAddress;  DWORD NumberParameters;  

ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];

} EXCEPTION_RECORD,  *PEXCEPTION_RECORD;

SEH in x86 Environments 

//SehHandler——>PEXCEPTION_ROUTINE

typedef

EXCEPTION_DISPOSITION

(*PEXCEPTION_ROUTINE) (

IN struct _EXCEPTION_RECORD *ExceptionRecord,

IN PVOID EstablisherFrame,

IN OUT struct _CONTEXT *ContextRecord,

IN OUT PVOID DispatcherContext

);

//FS:[0]所指结构

typedef struct _EXCEPTION_REGISTRATION_RECORD {

struct _EXCEPTION_REGISTRATION_RECORD *Next;

PEXCEPTION_ROUTINE Handler;

} EXCEPTION_REGISTRATION_RECORD;

typedef EXCEPTION_REGISTRATION_RECORD *PEXCEPTION_REGISTRATION_RECORD;

#define EXCEPTION_CHAIN_END ((struct _EXCEPTION_REGISTRATION_RECORD * POINTER_32)-1)

//VS2008使用的SehHandlerVC6使用的是_except_handler3

EXCEPTION_DISPOSITION __cdecl

_except_handler4(

IN struct _EXCEPTION_RECORD *ExceptionRecord,

IN PVOID EstablisherFrame,

IN OUT struct _CONTEXT *ContextRecord,

IN OUT PVOID DispatcherContext

);

C++中的异常处理

try/catch提供的异常处理机制都是不可恢复的。也就是说,发生异常时,处理完catch块后,线程不会继续执行产生异常的try

Visual C++中的__try/__catch

这是微软对C++的扩展,扩展后的关键字__try/__catch好像具有结构化异常处理的功能——线程继续执行中断或异常发生时的指令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值