2010-07-09 96 views
1

在Windows上,如果在調用堆棧中沒有涉及模塊的符號(例如崩潰轉儲),那麼調用堆棧中該模塊下面的所有調用都會出錯只有名字被遺漏,但也是序列)。在沒有符號的Windows和Mac OS X/Linux上的Callstack

在Linux或Mac OS X上,如果符號不存在,函數名稱不顯示,但呼叫順序仍然保留。

調用堆棧展開或符號生成的機制有什麼不同會導致這種差異?

回答

2

在Windows中,如果沒有符號信息的應用程序仍然有可能獲得完整的調用堆棧,只要將堆棧幀指針放在調用堆棧中即可。如果使用調試進行編譯,則這些堆棧幀指針由Visual Studio編譯器生成,但如果使用優化(/ Ox)進行編譯則不會生成這些堆棧幀指針。因此,如果您仍然希望帶有優化的堆棧幀指針,則必須添加/ Oy-編譯器選項(Oy-代表:不要刪除堆棧幀指針)。

堆棧幀指針只不過是指向下一個堆棧幀。因此,調試器和崩潰處理程序可以很容易地獲取堆棧(通過查看堆棧幀指針跟隨堆棧,並使用堆棧中的返回地址)。

如果應用程序沒有堆棧幀指針,調試器或崩潰處理程序必須使用調試信息來知道函數參數的數量,局部變量的數量......以獲取每個堆棧幀並遵循調用堆棧上的所有堆棧幀。

相關問題