除錯 EXC BAD ACCESS
EXC_BAD_ACCESS
表示程序嘗試以無效方式訪問記憶體,例如取消引用 NULL
指標或寫入只讀記憶體。這是最難的崩潰除錯的,因為它通常沒有錯誤訊息,有些宕機可能是非常難以複製和/或發生在程式碼完全無關的問題。這種錯誤在 Swift 中非常罕見,但如果發生這種情況,通常可以通過減少編譯器優化來更容易地除錯崩潰。
大多數 EXC_BAD_ACCESS
錯誤是由試圖取消引用 NULL
指標引起的。如果是這種情況,紅色箭頭中列出的地址通常是十六進位制數,低於正常的記憶體地址,通常是 0x0
。在偵錯程式中設定斷點或新增偶爾的 printf
/ NSLog
語句以找出該指標為 NULL
的原因。
發生不太可靠或完全沒有意義的 EXC_BAD_ACCESS
可能是記憶體管理問題的結果。可能導致這種情況的常見問題是:
- 使用已解除分配的記憶體
- 試圖寫出 C 陣列或其他型別緩衝區的結尾
- 使用尚未初始化的指標
在 Scheme Editor 的 Diagnostics 部分中,Xcode 包含一些有用的工具來幫助除錯記憶體問題:
Address Sanitizer 新增了大量檢查,可以在發生記憶體問題時停止應用程式,並提供有用的錯誤訊息,詳細說明發生的情況。Zombie Objects 檢測到已釋放的 Objective-C 物件存在問題,但你不應該在啟用自動引用計數時遇到這些問題。