随笔-341  评论-2670  文章-0  trackbacks-0
    本来昨天搞定了异常处理之后决定狂喜一天,谁知道今天用release编译了一下之后竟然挂了!资料找了半天发现是Windows XP之后提供的一项保护SAFESEH搞的鬼。于是需要将自己的异常处理函数添加进PE头的SAFESEH列表中。方法如下:

    添加一个asm文件,写如下内容:
1 .386
2 .model  flat
3 
4 VL_JIT_X86_EXCEPTION_HANDLER proto
5 .safeseh VL_JIT_X86_EXCEPTION_HANDLER
6 
7 end

    然后在这个文件的属性里面添加命令行/safeseh,并将函数在代码中做成extern "C"就可以了:
 1 /*******************************************************************************
 2 Vczh Library++ 2.0
 3 JIT::X86汇编异常处理器
 4 开发者:陈梓瀚
 5 
 6 接口:
 7 类:
 8 函数:
 9 *******************************************************************************/
10 
11 #ifndef VL_JIT_x86EXCEPTIONHANDLER
12 
13 #include <windows.h>
14 
15 extern "C"
16 {
17     EXCEPTION_DISPOSITION __cdecl VL_JIT_X86_EXCEPTION_HANDLER
18     (
19         struct _EXCEPTION_RECORD *ExceptionRecord,
20         void * EstablisherFrame,
21         struct _CONTEXT *ContextRecord,
22         void * DispatcherContext
23         );
24 }
25 
26 #define VL_JIT_x86EXCEPTIONHANDLER
27 #endif

    这两部合起来就成功将自己的异常处理函数标记成安全的了。

    继续狂喜。
posted on 2009-03-04 08:40 陈梓瀚(vczh) 阅读(1865) 评论(2)  编辑 收藏 引用 所属分类: JIT

评论:
# re: JIT脚本引擎:关于自己的异常处理函数在Release下失效的解决办法 2009-03-04 19:56 | ai
请问这种异常机制是否能捕获到堆栈溢出的问题,比如
memcpy时,长度写成-1,这样就会堆栈溢出,现象就是进程消失,try不起作用!现在暂时用windbg挂上他,等出问题题时截住他!不知道是否还有别的好的方法?多谢  回复  更多评论
  
# re: JIT脚本引擎:关于自己的异常处理函数在Release下失效的解决办法 2009-03-04 21:28 | 陈梓瀚(vczh)
@ai
这种方法就是try的方法。try不起作用【可能】是因为你catch那里需要用到堆栈,结果不行,重复抛异常。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理