我一直在尝试在我的代码(它使用 setjmp)中追踪一个间歇性崩溃错误,并将其缩小为:使用 /O2 编译时出现,使用 /O2 /Oy- 消失,即只显示 omit帧指针。
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议 setjmp 需要一个帧指针。因此:
似乎当使用 /O2 编译使用 setjmp 的程序时,Visual C++ 会默默地生成导致间歇性堆栈损坏的代码。这是真的,还是我错过了什么?
在我看来,只有调用 setjmp 的函数才需要用帧指针编译,程序的其余部分——甚至是调用 longjmp 的函数——应该可以省略帧指针。这是真的?
编辑:我进一步缩小了范围。
在调用 setjmp 的函数上启用帧指针没有任何区别,但那是因为编译器已经在这样做了,正如它应该做的那样,显然注意到它需要完成,并自动执行。
真正有所作为的是在 main.js 上启用了帧指针。这并不像听起来那么奇怪,因为崩溃是从 main 的回报中体现出来的。现在我想到了,我可以在谷歌快速搜索 setjmp 用法中找到的所有示例,在 main.js 中执行。也许碰巧微软编译器团队只是这样测试它。
这是使用它的惯用方式,也许最好的解决方法是我将 setjmp-using 函数内联到 main.js 中。