2013-03-14 54 views
0

64位Windows程序中的某些种类的事件,例如如果你通过一个保护页检测到它,那么除零,空指针引用,堆栈溢出通常被处理(在一个程序中发现它是处理它们所必需的),并带有结构化或向量化的异常。longjmp out of vectored exception handler

在JIT编译器的上下文中,由于需要提供展开信息并符合所有函数的展开协议,因此结构化例外稍微有些尴尬,因为这些协议可能与例如一个复制垃圾回收器,用于移动代码块,这表明使用了向量异常。

虽然向量化异常处理程序通常需要返回,但为此目的使用它们将涉及使用longjmp或一些等效代码退出处理程序,该代码会在不进行任何展开的情况下重置堆栈指针。

这是合法的,还是有一些我忽略的绊脚石?

UNIX中的等价似乎是合法的,什么是值得:Longjmp out of signal handler?

回答

0

嗯,似乎在我跑的测试,做工精细。

#include <setjmp.h> 
#include <stdio.h> 
#include <windows.h> 

jmp_buf jmp; 

LONG CALLBACK eh(PEXCEPTION_POINTERS e) { 
    longjmp(jmp, 1); 
} 

void main() { 
    AddVectoredExceptionHandler(1, eh); 
    for (int i = 0; i != 10; ++i) 
     if (!setjmp(jmp)) 
      *(char*)0 = 0; 
     else 
      puts("ok"); 
    getchar(); 
}