Xcode IDE概覽
Xcode 頁面主要分為以下四個部分:
- 工具欄(ToolBar area):主要負責程序運行調試,編輯器功能區域的顯示 / 隱藏;
- 編輯區(Editor area):代碼編寫區域;
- 導航區(Navigator area):展示工程文件列表;
- 調試區(Debug area):用于程序調試,查看對象信息,打印日志等。
?導航區
詳細功能分別為:
- 項目導航器(Project navigator):在工程中添加、刪除、分組以及管理文件、查看文件、或者在編輯取區編輯其內容
- 版本控制管理器 (Source Control navigator): 查看源代碼控制工作副本、分支、提交、標簽和遠程代碼庫。
- 符號導航器(Symbol navigator):集成所有在工作區中定義的符號,從根本上說符號就是編輯器所能識別的東西,eg:OC 類、結構體、枚舉類型、全局變量等
- 搜索導航器(Find navigator):在項目和框架中查找任何字符串、引用、定義以及調用層級。
- 問題導航器(Issue navigator):可查看在打開、分析以及構建項目過程中發現診斷、警告以及錯誤信息
- 測試導航器(Test navigator):創建、管理、運行以及檢查單元測試
- 調試導航器(Debug navigator):查看項目運行的 CPU、內存、磁盤、網絡等情況,詳細介紹
- 斷點導航器(Breakpoint navigator):添加、刪除和編輯斷點。
- 報告(日志)導航器(Report navigator):查看構建、運行和調試項目以及源代碼控制任務的歷史記錄。
分別對應快捷鍵為:Command + 1 ~ 9
Xcode 常用快捷鍵
文件操作快捷鍵
作用 | 快捷鍵組合 |
---|---|
在當前工程中創建一個新文件 (一般包括.h 和 .m 文件) | Command + N |
在當前工程中創建一個新工程 | Command + Shift + N |
在工程中關閉當前正在屏幕中顯示的文件 | Command + W |
最小化 xcode 編譯器窗口 | Command + M |
調試快捷鍵?
作用 | 快捷鍵組合 |
---|---|
編譯并運行 | Command + R |
編譯 | Command + B |
強制退出 | Command + Q |
停止運行 | Command + . |
繼續 (到下一個斷點,如果沒有則執行到結束) | Command ?+ Control + ?Y |
單步調試 | F6 |
跳入某函數 | F7 |
跳出某函數 | F8 |
添加 / 刪除斷點 | Command + \ ?(光標必須在指定的行) |
靜態代碼分析 | Command + Shift + B |
?Xcode 常用調試方法
斷點
斷點里面根據作用和功能也有很多種類:普通斷點、條件斷點、異常斷點、符號斷點等。
?普通斷點
當程序運行到斷點處時會暫停運行。比如斷點打在 30 行,那么程序就會停在 30 行(注意:程序只運行到了前 29 行,第 30 行其實還沒有被執行。)。只要在代碼行旁邊點擊,就能添加一個斷點,再次點擊,斷點變成淺藍色,就能讓斷點不可用(disable 了,仍然存在,只是不起作用了)。?
條件斷點
打上斷點之后,對斷點進行編輯,設置相應過濾條件。單擊右鍵會彈出選項框,四個選項分別為:
- Edit BreakPoint:編輯斷點。
- Disable ?BreakPoint:斷點失效。(相當于上邊說到的單擊斷點變成淺藍色,斷點失效)
- Delete BreakPoint:刪除斷點。
- Reveal in BreakPoint Navigator:在左邊的斷點樹狀結構表明該斷點。
這里我主要用到的是第一個:Edit BreakPoint。這里面設置斷點的篩選條件(雙擊斷點也可以快速進入編輯斷點的對話框)。
- Condition: 返回一個布爾值,當布爾值為真觸發斷點,一般里面我們可以寫一個表達式。
- Ignore: 忽略前 N 次斷點,到 N+1 次再觸發斷點。
- Action: 斷點觸發事件,分為以下六種:?
- AppleScript:執行腳本。
- Capture GPU Frame:用于 OpenGL ES 調試,捕獲斷點處 GPU 當前繪制幀。
- Debugger Command:和控制臺中輸入 LLDB 調試命令一致。
- Log Message:輸出自定義格式信息至控制臺。
- Shell Command:接收命令文件及相應參數列表,Shell Command 是異步執行的,只有勾選 “Wait until done” 才會等待 Shell 命令執行完在執行調試。
- Sound:斷點觸發時播放聲音。
- Options (Automatically continue after evaluating actions 選項):選中后,表示斷點不會終止程序的運行。
異常斷點
利用 Xcode 進行軟件開發時,總避免不了出現異常而導致程序崩潰,但有時候又不知道哪里出錯,只能利用下斷點一點一點測試,雖然也能測出來但總是不能一步到位。其實 Xcode 有個異常斷點,可以在導致程序崩潰或者引發異常的那行代碼上自動設置斷點。
步驟 1??:(1)打開斷點導航器 -> (2) 點擊下方?號 ->(3)選擇 “Exception Breakpoint”
步驟 2??:按照上述步驟選擇之后,將會看到異常斷點的編輯條件,在這里你可以根據自己的需要編輯自己的異常斷點條件:
Exception?選項可以讓你選擇響應 Objective-C 對象拋出的異常,也可以選擇響應 C++ 對象拋出的異常。?Break?則是選擇斷點所接收的異常,是接收 “Throw” 語句拋出的異常還是 Catch 語句的。
步驟 3??:運行程序,解決問題后。刪除該異常斷點。
符號斷點
Symbolic Breakpoint 為符號斷點,可以針對某一個方法 (函數) 設置斷點并暫停執行;有時候,我們并不清楚會在什么情況下調用某一個函數,那我們可以通過符號斷點來跟蹤獲取調用該函數的程序堆棧。
步驟 1??:如同設置異常斷點一樣,在點擊?之后,選擇 “Symbolic BreakPoint”
步驟 2??:編輯要斷點的方法名、條件等。
- Symbol:填入你想設置斷點的方法(例如:-[NSException raise],- 號是實例方法,+ 號是類方法)。
- Module:填入要設置斷點的方法或函數是否在位于 dylib 中,默認不填。
- Conditon:填入條件,例如:(BOOL)[item isEqualToString:@“test”] 前面的(BOOL)是必須的。否則 console 會提示類型不符合,導致條件不能生效。意思是 item(NSString)是 test 時停下。
- Ignore:忽略幾次。
- Action:可在程序斷點執行后增加額外動作(Applescript,捕捉動畫幀速,調試器命令(lldb),輸入 log 記錄,終端命令(shell), 播放聲音)例如:Debugger Commond 中可填入?
- po item 輸出 item 變量的值
- bt 表示輸出 方法調用堆棧信息
步驟 3??:假如輸入的方法名為:?[UIView init],此時就可以看到新加的斷點方法。
步驟 4??:運行項目,此時 Xcode 會停在你的斷點方法中。
日志輸出
關于日志輸出,最先可能想到的是在代碼編輯區的 NSLog (),雖然在打印的時候很清晰,但是缺點就是在我們需要在想要打印的位置添加 NSLog 代碼并重新運行項目,這樣會比較耽誤時間,影響開發效率,而我們在調試過程中用的比較多的是打斷點,然后 p 或者 po 一下。這個 p 和 po 就是 LLDB 中的打印(print)命令。像下圖中,在 29 行中打了斷點,在下方控制臺的右邊會出現一個 "lldb" 的對話窗。
help 命令
在 lldb 中輸入 help,然后回車,可以看到 lldb 的一些常用的命令,如下圖所例。常用的命令為 po、p、expression、call...
expression 命令
expr 或 e : expression 的縮寫,可以在調試時動態執行指定表達式,并將結果打印出來,是 LLDB 調試命令中最重要的命令,我們以后經常用到的 p 和 po 命令的鼻祖 。expression 命令主要有兩個功能:
- 執行表達式
- 輸出返回值
注意:雖然 expression 命令有輸出返回值功能,但是在日常調試過程中并不常用,一般這類打印功能被 p 和 po 命令代替,而 expr 常用于在調試過程中修改變量的值。
?p & print ?& e ?& call 命令
?po 命令
oc?里所有的對象都是用指針表示的,打印出來的是對象的指針,而不是對象本身,可以采用 -o 來打印對象本身為了更加方便的時候,LLDB 為 “expression -o --” ?定了一個別名 :po?,它可用于輸出 OC 對象和對象的信息。
?call 命令
方法調用:在斷點調用某個方法,并輸出此方法的返回值,一般常用于方法的調用。
image 命令
常用命令如下:
- image list:查看工程中使用的庫
- image lookup:可以用來查找可執行文件或共享庫的原始地址,當程序崩潰的時候,可以使用這條命令來查找崩潰所在的具體位置。
如下代碼:
運行此代碼,崩潰信息如下:
上述 crash 根據調用棧信息如何定位到具體哪行代碼出現問題:
我們可以使用在 LLDB 中使用?image lookup -a 地址??或者 ??image lookup --address 地址?命令進行定位。
通過逐步查看調用棧信息,我們可以看到的是在?-[ContainerViewController viewDidLoad]?方法中也就是在 ContainerViewController.m 文件的第 36 行數組越界導致的崩潰。
?LLDB 調試對話窗
從左到右功能依次詳細介紹:
- 顯示 / 隱藏控制臺
- 斷點信息:如果為藍色,就是斷點有效。如果點擊它變成灰色,就是所有斷點不起作用。
- continue:點擊這個按鈕程序就會從當前斷點恢復運行,直到下一個斷點
- step over :點擊這個按鈕會一步一步的運行,方便調試
- step in:點擊這個按鈕會進入函數內部
- step out:點擊這個按鈕會跳出函數內部,回到函數調用處,一般與左邊的按鈕對應使用
- 視圖調試器:查看圖層,在第 2.4 四節中詳細介紹
- 內存結構圖(menory graph):方便查看堆棧信息
- 覆蓋調試器的環境變量設置
- 模擬器定位開關
性能檢測
靜態分析:通過對代碼靜態分析,找出代碼潛在的錯誤,如內存泄漏、空引用、未使用函數等。方法:菜單 “Product"->"Analyze" 或者使用快捷鍵 ?Shift + Command + B ,然后想辦法消滅藍箭頭。
具體參考我的這篇博客:
heap memory with Xcode-CSDN博客
?