硬件或操作系统所指的中断和异常
a) 这种情况是,线程先注册一个中断处理函数,当特定的事件发生时,由硬件或操作系统调用中断处理函数,执行完中断处理函数后,线程继续执行中断或异常发生时的指令
b) 中断与异常的区别:
按《软件调试》(张银奎著)的说法,中断是由硬件产生的,异常是由软件产生的
c) X86架构下的IDT、Linux下的信号(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使用的SehHandler,VC6使用的是_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好像具有结构化异常处理的功能——线程继续执行中断或异常发生时的指令