64位Windows程序中的某些类型的事件,例如被零除、空指针引用、堆栈溢出(如果您使用保护页检测到这一点),通常会使用结构化或矢量化异常进行处理(在发现有必要处理它们的程序中)。
在JIT编译器的上下文中,结构化异常稍微有点笨拙,因为需要为所有函数提供展开信息并遵守展开协议,这可能不能与例如移动代码块的复制垃圾收集器很好地交互,这建议使用矢量化异常。
虽然向量化异常处理程序通常会返回,但使用它们来实现此目的将涉及使用longjmp或某些等效代码退出处理程序,这些代码将重置堆栈指针,而不进行任何展开。
这是合法的吗,还是我忽略了什么障碍?
在Unix中,等价物似乎是合法的,就其价值而言:Longjmp out of signal handler?
发布于 2013-03-15 06:54:28
嗯,在我运行的测试中,它似乎工作得很好。
#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();
}https://stackoverflow.com/questions/15408451
复制相似问题