首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setjmp和省略帧指针

setjmp和省略帧指针
EN

Stack Overflow用户
提问于 2011-05-04 17:39:44
回答 2查看 980关注 0票数 5

我一直试图在我的代码(使用setjmp)中跟踪一个间歇性的崩溃错误,并将其缩小为:在使用/O2编译时显示,使用/O2 /Oy-,即只显示省略的帧指针。

http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议setjmp需要一个框架指针。因此:

  1. 似乎是在使用/O2编译一个使用setjmp的程序时,VisualC++无声地生成导致间歇性堆栈损坏的代码。这是真的,还是我遗漏了什么?在我看来,只有调用setjmp的函数才需要使用框架指针进行编译,程序的其余部分--甚至调用longjmp的函数--应该可以省略框架指针。这是真的吗?

编辑:,我已经把它缩小了一点。

在调用setjmp的函数上启用框架指针没有什么区别,但这是因为编译器已经在这样做了,就像它应该做的那样,显然注意到需要这样做,并自动执行它。

真正起作用的是启用主帧指针。这并不像听起来那么奇怪,因为崩盘是从main的回报中显现出来的。现在我想起来了,我可以在google快速搜索setjmp用法中找到所有的例子,主要是这样做的。也许微软编译器团队只是以这种方式对其进行测试。

这是使用它的惯用方式,也许最好的解决方法是将setjmp使用函数内联到main中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-12 16:59:10

好的,我已经发布了一个带有独立测试用例的bug报告,希望有一个修复程序:http://connect.microsoft.com/VisualStudio/feedback/details/666704/visual-c-generates-incorrect-code-with-omit-frame-pointer-and-setjmp

同时,解决方法是不使用省略框架指针,或者将调用setjmp的代码放在main中,或者将调用longjmp的函数放在与调用setjmp相同的源文件中。

票数 3
EN

Stack Overflow用户

发布于 2011-05-12 17:37:09

您能指定更多关于坠机本身的信息吗?我的意思是,为longjmp生成的编译器是在longjmp之后,还是在尝试访问自动变量时,还是在尝试退出函数时立即发生崩溃?

我猜目标函数必须用标准的堆栈框架编译,对使用longjmp的函数似乎没有合理的限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5887552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档