- 主题:如果才能catch住null pointer异常
在qt和mingw环境中好像捕获不了,seh貌似是微软定义的,在vs环境下才可以用。
--
FROM 120.228.78.*
null pointer deref不是C++异常,或者说是系统相关的异常。
所以只有系统支持这种时才可能捕获。比如windows上SEH/VEH。Linux上只有signal handler。
除了OS,还得编译器支持。如果编译器不支持,只能手动搞。
比如Windows上,MSVC之外的编译器不支持它家的__try/__except,你可以用汇编代码建立SEH的frame来捕捉异常,也就是自己把__try/__except实现一下,不过有点蛋疼就是了
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
有人已经写了 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.*
不用setjmp/longjmp的思路是?讲讲学习一下。
我断断续续看过异常处理好几次,没考虑过怎么自己实现,trap a hardware exception。这个实现还是挺简单的,很有启发性:
1 安装handler,setjmp
2 根据setjmp第一次返回值,执行 try 代码,
2.1 如果异常,跳到handler,拷贝 record和context, longjmp,回到 1,转3
3 根据setjmp第二次返回值,执行 except 代码
4 出作用域,移除当前handler
这种执行一半跳到另一个函数,处理一下,再跳回来带着返回值,很像cpp coroutine 的思路。
【 在 z16166 的大作中提到: 】
: 按说不需要setjmp/longjmp
: 不过要捕捉空指针异常,这个需求本身就有问题
:
--
修改:DoorWay FROM 61.185.186.*
FROM 61.185.186.*
再多讲点,比如有个cpp函数foo,进入foo后,
先把下面的汇编写上,再把正常的逻辑guarded body 填到注释那里吗?
最后用mingw编译?
someProcedure PROC FRAME:defAsmSpecificHandler
push rbp
.pushreg rbp
mov rbp, rsp
.setframe rbp, 0
.endprolog
__TRY
; Guarded Section of code (level 0)
_TRY
; Another Guarded Section of code (level 1)
_EXCEPT
; Another Exception Handler (level 1)
_FINALLY
__EXCEPT
; Exception Handler (level 0)
__FINALLY
mov rsp, rbp
pop rbp
ret
someProcedure ENDP
【 在 z16166 的大作中提到: 】
: C++编译器生成的__try/__except的汇编代码也是这个机制,就是建立SEH chain。
: 而且C++是可以调用汇编的,用汇编写的asm文件编译成obj给c++调用就行。
: 嵌入asm也行。
: ...................
--
FROM 61.185.186.*
这些汇编语言,需要再翻译成mingw认识的汇编形式吗,如果要测试的话?
【 在 DoorWay 的大作中提到: 】
: 再多讲点,比如有个cpp函数foo,进入foo后,
: 先把下面的汇编写上,再把正常的逻辑guarded body 填到注释那里吗?
: 最后用mingw编译?
: ...................
--
FROM 61.185.186.*