【问题标题】:longjmp out of vectored exception handler向量异常处理程序中的 longjmp
【发布时间】:2013-03-14 11:50:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: windows exception-handling 64-bit setjmp


    【解决方案1】:

    嗯,它似乎在我运行的测试中运行良好。

    #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();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多