iOS 高效除錯

發表於2016-12-28

寫程式碼難免出現bug。 儲備些除錯技能絕對能夠提高你的工作效率,讓bug無所遁形。下面就和大家分享一些我在工作中常用的iOS除錯小技能。

1. 列印


最簡單,基礎的除錯方法就是列印日誌了。貼出兩段封裝好的日誌列印程式碼:

eg:

2. 斷點


(1)普通斷點

普通斷點是除錯中最常使用的。當程式執行到斷點處就會暫停執行。其設定方法非常簡單:在需要設定斷點的程式碼行的左側單擊即可。

111748276-5021b617725d6d14

普通斷點

(2)條件斷點(為斷點新增條件和其他屬性,暫且就稱它條件斷點)

條件斷點是在普通斷點的基礎上新增了判斷條件。當程式執行到斷點處,並且滿足設定的條件時斷點才會有效。設定方法如下:

121748276-4757cfd4456badd3

開啟斷點編輯框

131748276-ec4305f11074063b

這裡寫圖片描述

在上面的設定中,條件斷點的條件是 i==3, 那麼在整個迴圈中只有在i=3時程式才會在斷點處停止執行。
Edit Breakpoint…視窗中有下面四個輸入項:

  • Condition 設定的條件。
  • Ignore 表示忽略多少次之後斷點有效。例如:不設定條件,Ignore設定為4,則i=4時程式在斷點處停止。
  • Action 在程式斷點處執行的操作(執行完這個操作後程式碼停止執行,此時設定斷點處的程式碼還沒有執行)。這裡的操作是LLDB語句,關於LLDB會在下面介紹。
  • Options 當選中時,執行完Action的操作後程式碼不會停止,就像沒有設定斷點一樣。

(3)異常斷點Exception BreakPoint

在設定異常斷點的情況下 當程式crash時 Xcode會幫我們定位到crash產生的位置。

141748276-7514ce072dccf274

沒有異常斷點的情況

151748276-f413a7763c107d88

設定異常斷點的情況

設定異常斷點步驟:

161748276-22fb1c126677fe1f

這裡寫圖片描述

(4)符號斷點Symbolic Breakpoint

符號斷點能夠為某一個方法或者 某一個類的某一個方法設定斷點。實現的功能如下圖:

171748276-3bb5df3ff9ce5050

某一個類的某一個方法設定斷點

181748276-3ec9d23c4ebd9791

在某個方法中執行斷點

設定步驟如下:

191748276-9a5c360602e90df0

符號斷點設定步驟

3. LLDB


LLDB的Xcode預設的偵錯程式, 我們通過執行LLDB命令使除錯過程更加的靈活。
Xcode內嵌LLDB除錯視窗。在程式執行到斷點後你可以輸入LLDB命令操作除錯過程。

201748276-a5c0ddd5ca09e37b

LLDB除錯視窗

LLDB常用命令如下:

1, po (print object)輸出物件, 如 po [self view];
2, p (print)用於輸出基本型別, 如 p (int)[[[self view] subviews] count] 輸出子檢視個數。
3, expr (expression) 可以在除錯時動態執行指定表示式,並將結果列印出來。常用於在除錯過程中修改變數的值。例如上圖所示,程式第一次執行到斷點時
執行下面的指令:expr i=4
你會看到如下的輸出: (int) $0 = 4
繼續執行程式,程式輸出的資訊是:value:4 i==4
4, call call即是呼叫的意思。其實上述的po和p也有呼叫的功能。因此一般只在不需要顯示輸出,或是方法無返回值時使用call。我們可以在viewDidLoad:裡面設定斷點,然後在程式中斷的時候輸入下面的命令: call [self.view setBackgroundColor:[UIColor redColor]] 此時view的背景顏色變為紅色。
5, bt 列印呼叫堆疊,加all可列印所有thread的堆疊。不詳細舉例說明,感興趣的朋友可以自己試試。
6, fr v -R 命令來列印出變數的未加工過時的資訊

如果想了解更詳細的內容,戳這裡。

4. Chisel


Chisel是 facebook開源的用於介面除錯的lldb命令。

安裝

Chisel 使用 homebrew 來安裝,如果你沒有安裝homebrew, 參考 homebrew

安裝完成後,在~/.lldbinit 中新增如下內容, 沒有~/.lldbinit則新建。

重啟Xcode, 此時Chisel就可以使用了。

命令

211748276-721e732ee27627fc

命令集合

英語不好的同學可以看這裡。

5. 介面除錯利器: Reveal


Reveal 絕對是iOS介面除錯利器。只要用上一次你就會離不開它。對於Reveal的介紹可以去官網瞭解。

安裝

Reveal是收費的,提倡正版。下面的破解版只供教學使用,不可用於生產環境。

1, 從官網下載Reveal並安裝;
2,下載破解檔案 提取密碼:7×48;
3,破解步驟見破解檔案中的使用說明。
4, 開啟Reveal,開始使用。Reveal的新版本可能修改驗證邏輯,如果沒有破解成功那就使用正版的吧。

在專案中配置

在使用Reveal之前需要對iOS專案進行簡單配置。

配置方法1:

Reveal可以使用cocoa pods匯入:在Podfile檔案中匯入 pod ‘Reveal’, ‘~> 1.3’。

配置方法

如果不使用cocoa pods,配置起來略有麻煩。下面是詳細的配置過程:
1, 使用Xcode開啟你想要檢視UI的工程;

2, 開啟Reveal,點選 Help → Show Reveal Library in Finder;

221748276-f145753f454213df

這裡寫圖片描述

3,將Reveal.framework 拖入開啟的Xcode工程.並點選完成;

231748276-dd2689f49cc20e61

這裡寫圖片描述

4,點選Build Phases 然後從Link Binary With Libraries 刪除Reveal.framework;

241748276-2d8be2c9531c590b

從Link Binary With Libraries 刪除Reveal.framework

5, 然後選中Build Settings 在搜尋欄中輸入 Other Linker Flags。選中Other Linker Flags
在Other Linker Flags中輸入下面程式碼 : -ObjC -lz -framework Reveal

251748276-04d19960011bf0a4

配置 Other Linker Flags

6,執行模擬器,開啟Reveal,連結模擬器。

261748276-46c3f28630ba2225

連結模擬器

到此大功告成。接下來你就可以通過Reveal 對你的介面進行debug了。

271748276-47c29c38c8b1f28a

效果

6. 除錯工具集:FLEX


FLEX是Flipboard開源的一系列在應用中除錯的工具集。FLEX以第三方庫的形式整合在應用中,使用時將類庫加到工程中,然後 通過呼叫[[FLEXManager sharedManager] showExplorer]; 就可顯示出用於除錯的工具欄進行除錯。

它提供的功能如下:

  • 檢視、修改views
  • 檢視任何物件的屬性
  • 動態的修改屬性
  • 動態的呼叫例項方法和類方法
  • 檢視網路請求過程
  • 新增模擬的鍵盤快捷鍵
  • 檢視系統日誌
  • 從堆中獲取任何物件
  • 檢視沙盒中的檔案
  • 檢視檔案系統中的SQLite/Realm資料庫
  • 在模擬器中觸發3D touch
  • 檢視你應用中所有的類
  • 快速獲取常用的類,例如[UIApplication sharedApplication], the app delegate, the root view controller on the key window, and more.
  • 動態的檢視NSUserDefaults裡面的值

簡直吊炸天。當你將FLEX整合到你專案中時就會認識到它的威力。

結語

上面介紹了六種除錯方法,開發時可以根據具體情況選用最合適的除錯方法。

相關文章