iOS高效調試

Normand8302 9年前發布 | 8K 次閱讀 Xcode iOS開發 移動開發

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

1. 打印

最簡單,基礎的調試方法就是打印日志了。貼出兩段封裝好的日志打印代碼:

//swift版
func DLog<T>(message: T, file: String = #file, method: String = #function, line: Int = #line) { 
    #if DEBUG 
        print("<\((file as NSString).lastPathComponent) : \(line)>, \(method)  \(message)")
    #endif
}

//OC版
#ifdef DEBUG
     #define DLog(fmt, ...) NSLog((@"<%s : %d> %s  " fmt), [[[NSString stringWithUTF8String:__FILE__] lastPathComponent]   UTF8String], __LINE__, __PRETTY_FUNCTION__,  ##__VA_ARGS__);
#else
    #define DLog(...)
#endif

eg:

//在AppDelegate.m中調用下面的方法
- (void)applicationDidFinishLaunching:(UIApplication *)application{
    DLog(@"hello world");
}
//打印結果: 2016-09-18 17:19:27.931 DateCell[2901:1622220] <AppDelegate.m : 54> -[AppDelegate applicationDidFinishLaunching:]  hello world

2. 斷點

(1)普通斷點

普通斷點是調試中最常使用的。當程序運行到斷點處就會暫停運行。其設置方法非常簡單:在需要設置斷點的代碼行的左側單擊即可。

普通斷點

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

條件斷點是在普通斷點的基礎上添加了判斷條件。當程序執行到斷點處,并且滿足設置的條件時斷點才會有效。設置方法如下:

打開斷點編輯框

這里寫圖片描述

在上面的設置中,條件斷點的條件是 i==3, 那么在整個循環中只有在i=3時程序才會在斷點處停止執行。

Edit Breakpoint... 窗口中有下面四個輸入項:

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

(3)異常斷點Exception BreakPoint

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

沒有異常斷點的情況

設置異常斷點的情況

設置異常斷點步驟:

這里寫圖片描述

(4)符號斷點Symbolic Breakpoint

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

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

在某個方法中執行斷點

設置步驟如下:

符號斷點設置步驟

3. LLDB

LLDB的Xcode默認的調試器, 我們通過執行LLDB命令使調試過程更加的靈活。

Xcode內嵌LLDB調試窗口。在程序執行到斷點后你可以輸入LLDB命令操作調試過程。

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是 非死book開源的用于界面調試的lldb命令。

安裝

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

brew update
brew install chisel

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

# ~/.lldbinit
...
command script import /path/to/fblldb.py

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

命令

命令集合

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

5. 界面調試利器: Reveal

Reveal 絕對是iOS界面調試利器。只要用上一次你就會離不開它。對于Reveal的介紹可以去官網了解。

安裝

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

1, 從 官網 下載Reveal并安裝;

2,下載 破解文件 提取密碼:7x48;

3,破解步驟見破解文件中的使用說明。

4, 打開Reveal,開始使用。Reveal的新版本可能修改驗證邏輯,如果沒有破解成功那就使用正版的吧。

在項目中配置

在使用Reveal之前需要對iOS項目進行簡單配置,配置步驟如下:

1, 使用Xcode打開你想要查看UI的工程;

2, 打開Reveal,點擊 Help → Show Reveal Library in Finder;

這里寫圖片描述

3,將Reveal.framework 拖入打開的Xcode工程.并點擊完成;

這里寫圖片描述

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

從Link Binary With Libraries 刪除Reveal.framework

5, 然后選中Build Settings 在搜索欄中輸入 Other Linker Flags。選中Other Linker Flags

在Other Linker Flags中輸入下面代碼 : -ObjC -lz -framework Reveal

配置 Other Linker Flags

6,運行模擬器,打開Reveal,鏈接模擬器。

鏈接模擬器

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

效果

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集成到你項目中時就會認識到它的威力。

結語

上面介紹了六種調試方法,開發時可以根據具體情況選用最合適的調試方法。如果本博文對你有幫助就送個喜歡吧。

 

來自:http://www.jianshu.com/p/a4ae30a10fb8

 

 本文由用戶 Normand8302 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!