我一直在尝试查找代码中的间歇性崩溃错误(使用setjmp),并将其范围缩小到:使用/O2进行编译时显示,使用/O2/Oy-消失,即仅使用omit出现框架指针。
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议setjmp需要帧指针。因此:
编辑:我将其范围缩小了一些。
在正在调用setjmp的函数上启用帧指针没有什么区别,但这是因为编译器已经按照预期执行了此操作,显然注意到它需要完成并自动执行。
确实有所作为的是在main上启用了帧指针。这并不像听起来那样奇怪,因为坠机事件是从main处返回而来的。现在,我想起来了,我可以在google快速搜索setjmp用法时找到所有示例,都可以在main中完成。可能是Microsoft编译器团队仅以这种方式进行了测试。
那是使用它的惯用方式,也许最好的解决方法是对我来说,是将setjmp-using函数内联到main中。
最佳答案
好的,我已经发布了一个包含独立测试用例的错误报告,因此希望有一个修复程序正在发布:http://connect.microsoft.com/VisualStudio/feedback/details/666704/visual-c-generates-incorrect-code-with-omit-frame-pointer-and-setjmp
同时,解决方法是不使用忽略帧指针,或者将调用setjmp的代码放在main中,或者将调用longjmp的函数与对setjmp的调用放在同一源文件中。
关于c - setjmp和省略帧指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5887552/