有人已经写了 setjmp / longjmp
http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh
// Note the unmatched braces in these macros. These are to allow one to use
// the same variable name more than once (new scope).
#define __seh_try \
{ \
__SEH_EXCEPTION_REGISTRATION _lseh_er; \
__SEH_HANDLER _lseh_handler; \
\
_lseh_er.handler = \
reinterpret_cast<PEXCEPTION_HANDLER>(__SEH_HANDLER::ExceptionRouter); \
_lseh_er.exthandler = &_lseh_handler; \
asm volatile ("movl %%fs:0, %0" : "=r" (_lseh_er.prev)); \
asm volatile ("movl %0, %%fs:0" : : "r" (&_lseh_er)); \
int _lseh_setjmp_res = setjmp(_lseh_handler.context); \
while(true) { \
if(_lseh_setjmp_res != 0) { \
break; \
} \
#define __seh_except(rec, ctx) \
break; \
} \
PEXCEPTION_RECORD rec = &_lseh_handler.excRecord; \
PCONTEXT ctx = &_lseh_handler.excContext; \
\
asm volatile ("movl %0, %%fs:0" : : "r" (_lseh_er.prev)); \
if(_lseh_setjmp_res != 0)
#define __seh_end }
【 在 z16166 的大作中提到: 】
: null pointer deref不是C++异常,或者说是系统相关的异常。
: 所以只有系统支持这种时才可能捕获。比如windows上SEH/VEH。Linux上只有signal handler。
: 除了OS,还得编译器支持。如果编译器不支持,只能手动搞。
: ...................
--
FROM 38.75.136.*