我一直在試圖追蹤我的代碼(使用setjmp)中的間歇性崩潰錯誤,並將其縮小爲:與/ O2編譯時出現,與/ O2/Oy一起消失 - ,即只顯示與省略幀指針。setjmp和省略幀指針
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建議setjmp需要一個幀指針。因此:
看來,當使用的setjmp一個程序與/ O2編譯時,Visual C++默默生成使間歇堆棧損壞代碼。這是真的,還是我錯過了什麼?
在我看來,只有調用setjmp的函數需要用frame指針進行編譯,程序的其餘部分 - 即使是調用longjmp的函數 - 也應該可以省略frame指針。這是真的?
編輯:我已經收窄,進一步一點。
在調用setjmp的函數上啓用幀指針沒有什麼區別,但那是因爲編譯器已經這樣做了,就像它應該那樣,顯然注意到它需要完成並自動完成。
有什麼有所作爲是啓用主指針。這聽起來並不奇怪,因爲這次事故是從主要的回報中顯現出來的。現在我想到了,我可以在快速的谷歌搜索setjmp用法中找到所有的例子,在main中做。也許碰巧微軟編譯團隊只是這樣測試的。
這是使用它的慣用方式,也許最好的解決方法是我將setjmp-using函數內聯到main中。
這聽起來像是MSVC中的一個錯誤。我無法理解如何在沒有幀指針時執行失敗的'setjmp' /'longjmp'。看起來你必須竭盡全力讓它們破裂。無論如何,我只是在全局啓用幀指針;它對性能沒有太大的影響。 – 2011-05-04 17:46:35
什麼是崩潰的調用堆棧? – 2011-05-06 03:45:59
嗨,我想說這個bug仍然存在。請參閱關於gcc maillist的討論:http://gcc.gnu.org/ml/gcc/2011-10/msg00253.html – ollydbg23 2011-10-22 14:36:33