2012-08-13 64 views
2

我試圖調試的getter/setter方法.h文件,但同時附加到我要調試,當我把某些方法斷點的過程中,IDE會自動跳到斷點的文件在一個單獨的方法。有誰知道爲什麼會發生這種情況?爲什麼斷點在.h文件中跳轉?

有些事情我已經試過:

  • 重建和鏈接我調試
  • 刪除obj文件.exe文件,然後重新制作包含我想調試
  • 文件的目錄經過與任務管理器,以確保正確的.exe文件運行
  • 經過的.pdb的時間戳和.exe文件,以確保他們(大致)匹配

這不是整個解決方案的問題;我只偶爾見過這個。還有什麼我可以嘗試嗎?

+1

這是內聯函數嗎? – 2012-08-13 14:39:40

+4

嘗試禁用優化。當您的代碼得到優化時,您將失去在調試過程中正確導航的能力。 – Lanaru 2012-08-13 14:40:20

+3

另一個原因是從未使用函數,因此在優化版本中不會生成代碼。 – Andrey 2012-08-13 14:41:51

回答

3

考慮一個Point類和Rectangle類。想象一下,Point有一個名爲GetX()的getter,並且Rectangle有一個名爲GetLeft()的getter。在機器指令級別,這兩種方法可能是相同的,因爲它們都返回對象中的第一個32位值。

由於代碼是相同的,編譯器和/或連接體可以通過丟棄方法的一個副本,並解析爲丟棄的一個作爲調用所保留的一個的所有呼叫降低的二進制文件的大小。例如,鏈接器可能會從可執行文件中刪除Rectangle :: GetLeft(),並將所有調用替換爲調用Point :: GetX()的Rect :: GetLeft()。

發生這種情況時,調試器可以的getX()和GetLeft不再區分()。即使調用Rect :: GetLeft(),指令指針也位於屬於Point :: GetX()的代碼範圍內。您可以通過查看堆棧來查看實際調用的方法,但調試器不會爲您執行此操作。

通常情況下,你建立調試版本禁用,以避免調試這種混亂優化。這並不總是可能的。例如,您可能正在調試運行優化二進制文件的客戶的故障轉儲。在這種情況下,您只需要注意問題並瞭解調用環境即可知道實際發生了什麼。

相關問題