0

64 位 Windows 程序中的某些类型的事件,例如被零除、空指针引用、堆栈溢出(如果您使用保护页检测到),通常会使用结构化或向量异常来处理(在发现有必要处理它们的程序中) .

在 JIT 编译器的上下文中,结构化异常有点尴尬,因为需要提供展开信息并符合所有函数的展开协议,这可能无法与移动代码块的复制垃圾收集器很好地交互,这表明使用向量异常。

虽然通常期望向量化异常处理程序返回,但将它们用于此目的将涉及使用 longjmp 或一些等效的代码退出处理程序,这些代码会重置堆栈指针而不进行任何展开。

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

Unix 中的等价物似乎是合法的,因为它的价值:Longjmp out of signal handler?

4

1 回答 1

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();
}
于 2013-03-14T22:54:27.813 回答