除錯 EXC BAD ACCESS

EXC_BAD_ACCESS 表示程序嘗試以無效方式訪問記憶體,例如取消引用 NULL 指標或寫入只讀記憶體。這是最難的崩潰除錯的,因為它通常沒有錯誤訊息,有些宕機可能是非常難以複製和/或發生在程式碼完全無關的問題。這種錯誤在 Swift 中非常罕見,但如果發生這種情況,通常可以通過減少編譯器優化來更容易地除錯崩潰。

大多數 EXC_BAD_ACCESS 錯誤是由試圖取消引用 NULL 指標引起的。如果是這種情況,紅色箭頭中列出的地址通常是十六進位制數,低於正常的記憶體地址,通常是 0x0。在偵錯程式中設定斷點或新增偶爾的 printf / NSLog 語句以找出該指標為 NULL 的原因。

發生不太可靠或完全沒有意義的 EXC_BAD_ACCESS 可能是記憶體管理問題的結果。可能導致這種情況的常見問題是:

  • 使用已解除分配的記憶體
  • 試圖寫出 C 陣列或其他型別緩衝區的結尾
  • 使用尚未初始化的指標

在 Scheme Editor 的 Diagnostics 部分中,Xcode 包含一些有用的工具來幫助除錯記憶體問題:

StackOverflow 文件

Address Sanitizer 新增了大量檢查,可以在發生記憶體問題時停止應用程式,並提供有用的錯誤訊息,詳細說明發生的情況。Zombie Objects 檢測到已釋放的 Objective-C 物件存在問題,但你不應該在啟用自動引用計數時遇到這些問題。