iOS沉思錄 BAD ACCESS記憶體錯誤除錯

2021-08-01 00:13:44 字數 1719 閱讀 3034

bad_access報錯屬於記憶體訪問錯誤,會導致程式崩潰,錯誤的原因是訪問了野指標(懸掛指標)。野指標指的是本來指標指向的物件已經釋放了,但指向該物件的指標沒有置 nil,指標指向隨機的未知的記憶體,程式還以為該指標指向那個物件,導致存在一些潛在的危險訪問操作,這些危險訪問操作無法被指標指向的未知記憶體所處理,就會導致bad_access錯誤造成程式崩潰。訪問的含義包括多種情況,例如:向野指標傳送訊息,讀寫野指標本來指向的物件的成員變數等等。

首先除錯bad_access錯誤是比較困難的,我們知道bad_access錯誤是由於訪問了野指標,但程式不會在野指標出現時或者在我們訪問野指標的**處報錯,導致對其難以察覺,除錯方法思路如下:

首先是開啟殭屍物件診斷模式,利用殭屍物件來對野指標的出現位置提供線索。我們知道殭屍物件指的是引用計數為0被系統**的物件,但這些物件暫時還存在於記憶體中,且理論上還是可以使用的,但是不穩定。開啟殭屍物件診斷後,殭屍物件會暫時保持活躍用於除錯,我們的野指標在物件**後依然指向該殭屍物件,在訪問野指標也就是訪問殭屍物件的情況下可以被編輯器檢測出來。這個時候還是會報bad_access錯誤,但是後台會列印出該線索,例如下面的訪問野指標列印的後台資訊:

2017-03-12 16:28

:31.501

debug

[2371:1379247]

-[testviewcontroller respondstoselector:]

message

sent

todeallocated

instance 0x16749682

可以看出xcode告訴我們訊息傳送給了乙個殭屍物件,殭屍物件原本是testviewcontroller的乙個例項,但現在該物件被**了而開發者還試圖訪問它,由此可以很容易定位問題所在。

另外開啟殭屍物件診斷的方法為:開啟xcode頂部導航欄的product-scheme-edit scheme,在彈出的介面中選中左側的run模式,然後勾選右側dianostics下的zombie objects。不同版本xcode可能選項位置略有差異,此處為最新的xcode 8.2.1。

殭屍物件診斷可以幫助快速定位多數情況下的野指標問題,但也有時候不能奏效,這個時候只能利用xcode的analyze靜態分析幫助檢查可能出問題的地方,仔細檢查問題所在,比較費時。

使用方法很簡單,選中xcode頂部導航欄product-analyze或使用快捷鍵command+shift+b,分析需要花一些時間,然後左側會列出編輯器發現的存在潛在問題的地方,選中藍色圖示對應的問題項會跳到問題項所在的**行。但這只能給出一些潛在提示,幫助搜尋問題所在,不一定和我們的bug相關。

足球沉思錄

本部落格用於記錄我平時踢球的反思和總結。也許聽起來有點怪異 只聽過寫學習總結或工作總結的,你踢個球還寫什麼總結?踢球不就圖個開心嗎?我以前的想法也是這樣,只把踢球當做鍛鍊身體 放鬆身心的一種活動,踢得開心就行了,而不太在意自己踢得怎樣 存在什麼問題和怎麼改進等等。直到上個月有次週三晚上踢球,我被換到...

iOS沉思錄 OC和Swift語言互調

oc和swift之間的互調很簡單,ios8以後官方給出了這兩種語言之間的橋接方案,簡單說就是在swift工程中,通過提示建立的bridging標頭檔案可以將oc檔案和swift檔案銜接在一起,從而可以在oc檔案中引用swift類,或者在swift檔案中引用oc的類。應用較多的主要是在swift中呼叫...

買了本《沉思錄》

記憶中從大一開始就再沒看過除專業和計算機之外的書籍了,這些年雖然養成了時常看書的習慣,但看的書也僅僅侷限於這兩類,而且絕大多數是計算機的。單位去年發了一張家樂福的購物卡,但到今年6月份過期,乘下午還有時間,就去了一趟。剛好,有的攤位是買小書的,就去看了看,可惜上面大部分的書都印製的極為粗劣,倒是便宜...