1. 程式人生 > >iOS開發除錯技巧總結(持續更新中)

iOS開發除錯技巧總結(持續更新中)

作者:乞力馬紮羅的雪  原文

對於軟體開發而言,除錯是必須學會的技能,重要性不言而喻。對於除錯的技能,基本上是可以遷移的,也就是說你以前在其他平臺上掌握的很多除錯技巧,很多也是可以用在iOS開發中。不同語言、不同IDE、不同平臺的除錯,有同性也有個性。今天我們就來學習一下iOS開發中的除錯技巧,語言暫用為OC,IDE當然是強大的Xcode。首先說明下,Xcode已經為我們除錯專案提供了極大的方便。

【1.普通斷點】

斷點(Breakpoint)絕對是除錯程式的第一大選擇,也是掌握的基礎技能。顧名思義,當程式執行到斷點處時會暫停執行。比如斷點打在11行,那麼程式就會停在11行(注意:程式只執行到了前10行,第11行其實還沒有被執行!!!)。只要在程式碼行旁邊點選,就能新增一個斷點,再次點選,就能讓斷點不可用(disable了,仍然存在,只是不起作用了)。在某一行建立斷點的快捷鍵是:command+\

01.png

02.png

並能在除錯過程中在下方看到引數的值:

20160107205501140.png

【2.條件斷點】

以上的斷點只是最普通的,我們還能對斷點的屬性進行配置,設定條件,使斷點更加智慧化,右鍵斷點進入編輯對話方塊:

20160107205738854.png

我以一個迴圈作為測試程式碼:

20160107210259173.png

迴圈中的程式碼每次都要單步執行,可能這並不是我想要的。我想要在i為3的時候中斷程式,進行除錯,編寫條件如下:

20160107210654311.png

設定i==3的條件後,程式就會在該條件時中斷,而不會每次到達該位置都中斷。中斷時輸出如下:

20160107210924740.png

同時也可以設定Ignore引數,會忽略前面n次的斷點執行,會在第n+1次中斷。

12.png

除錯輸出如下:

13.png

同時,還可以檢視某個函式被呼叫的次數,設定Action引數如下,注意要選中Automatically continue after evaluating actions.

QQ截圖20160318151102.png

輸出結果如下:

QQ截圖20160318151110.png

【3.異常斷點】

斷點的功能不限於上面所述。開發iOS知道,如果我們因為異常然後程式crash了,程式碼就直接跑到main.m的main函式中去了。為什麼就不能跑到出現異常的程式碼中呢???異常斷點就為我們解決該問題,程式就會在異常出現的那行程式碼終止。建立異常斷點圖例如下:

QQ截圖20160318151147.png

如下所示就建立完成了。如果碰到異常crash時,嘗試使用異常斷點吧。

QQ截圖20160318151213.png

【4.符號斷點Symbolic Breakpoint】

符號斷點的建立也同異常斷點。一般符號斷點可以在你指定的[類名 方法名]時中斷執行。

QQ截圖20160318151238.png

配置符號斷點如下:可以當執行到ViewController類的viewDidLoad方法時中斷執行。

122.png

如果你的Symbol只寫了一個函式名,那麼就會在出現該函式名的地方就中斷執行。如下,就會在執行到doAnimation的時候中斷。是不是很強大呢?

QQ截圖20160318151313.png

QQ截圖20160318151319.png

【5.Analyze分析器】

Analyze分析器是一種靜態的工具,可以對我們的程式進行分析,找出我們未使用的變數,或一些死儲存。執行Analyze如下:Product-->Analyze. 如下藍色的標記就是靜態分析的結果。

QQ截圖20160318151313.png

QQ截圖20160318151319.png

當然,我們可以設定在編譯程式的時候同時Analyze,把下列選項設為Yes即可。

QQ截圖20160318151400.png

【6.Profile檢查器】

這個工具實在是太NB了,三言兩語說不完,貼張圖,大家感受一下,我會在以後的部落格中慢慢講解該工具的使用。同樣在Product-->Profile中開啟。

QQ截圖20160318151533.png

【7.殭屍物件】

iOS中把那些已經release但還沒完全消失的物件叫做殭屍物件,對已經release的物件再次釋放,就會發生異常。雖然自從使用ARC後,由於物件釋放產生的異常已經大大變少,但偶爾還會出現。開啟殭屍物件模式後,就能快速定位到異常位置。開啟方式如下:Product-->Scheme-->Edit Scheme. 勾選Enable Zombie Objects即可。

001.png

【8.lldb命令】

Xcode中使用llvm編譯器,公認為最好的C、C++、OC、Swift編譯器。而lldb是llvm中的偵錯程式,我們可以使用一些簡單的命令進行除錯,我還是把上面的迴圈程式碼作為測試程式碼。

002.png

斷點除錯中,使用po命令、print命令在Console控制檯打印出變數資訊:

003.png

【9.NSLog列印】

應該說NSLog列印資訊是初學者最喜歡的除錯手法,也是最簡單的除錯,通過打印出的資訊檢視程式執行的路徑。但是打印出的資訊較少,本身NSLog效率較低,有人使用巨集做了部分優化,程式碼如下:能夠打印出所在類名、所在方法名、詳細時間、行號。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #import "ViewController.h"   #define NSLog(format, ...) do { \   fprintf(stderr, " %s\n", \   [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \   __LINE__, __func__); \   (NSLog)((format), ##__VA_ARGS__); \   fprintf(stderr, "-------\n"); \   while (0)   @interface ViewController ()   @end   @implementation ViewController   - (void)viewDidLoad {   [

相關推薦

iOS開發除錯技巧總結持續更新

作者:乞力馬紮羅的雪  原文 對於軟體開發而言,除錯是必須學會的技能,重要性不言而喻。對於除錯的技能,基本上是可以遷移的,也就是說你以前在其他平臺上掌握的很多除錯技巧,很多也是可以用在iOS開發中。不同語言、不同IDE、不同平臺的除錯,有同性也有個性。今

前端開發工程師從入門到精通學習過程及資源總結持續更新

開發實戰 set dex 從入門到精通 main 知識 uno 基礎入門 易雲 職位名稱:前端開發工程師 學習概要:1、先了解基礎,html/css/JavaScript是基礎。html/css就是做靜態頁面的,javascript是做動態的。 2、學習框架:jQuery(

關於Yii2的MVC的視圖總結持續更新

gif pre lis frontend dbo register front reg open 一、首先在控制器中,將處理好的數據發送給前臺: $this->layout = ‘base‘; 這裏填寫視圖的模板文件(可以不寫這行代碼,如果不寫,默認為views/la

Java常見異常總結持續更新......

1.類未找到 Exception in thread "main" java.lang.NoClassDefFoundError:類名 Caused by: java.lang.ClassNotFoundException:類名 這種異常未未發現類異常,是由於編譯的時候未找到該類而報異常

計算機專業學習資料總結~持續更新

今天為了複習離散數學,想著上網上找份課本答案(老師沒有給答案),結果那本書的配套題解的PDF大多數都是來自CSDN社群的,CSDN下載需要積分,要麼開通VIP,那VIP的費用實在不是我等窮學生所能支付得起的,我靈機一動便想到了萬能的淘寶賣家果然有賣CSND積分的,花了1塊3,很順利地下載了我想要的輔導書,之前

java+selenium的使用方法歸納總結持續更新

selenium的使用 第一步:獲取selenium的jar包及驅動瀏覽器的驅動 在獲取selenium的jar包和瀏覽器的驅動包時,要對照她們的版本號 通過下面可檢視谷歌的版本對應 java+selenium的入門 案例 selenium包 谷歌驅動包 火狐驅動包 IE驅動包

遇到的錯誤總結持續更新

一、Sql server 2008 R2 配置管理工具服務顯示遠端過程呼叫失敗:0x800706be 通過網上查,才知道是因為SQL Server2008 與VS2014 共存的問題,當你電腦中同時裝了這兩樣東西,SQL 就會出現上圖中的情況。   解決辦法:從控制面板或者其他輔助軟體中找

Golang語法的踩坑總結持續更新

*本來這篇是想寫docker的基本操作總結的。。。想想還是寫這個吧。。。→_→* 變數宣告使用 := 方式時,左值必須是未宣告的,否則會出現編譯錯誤 //.\main.go:8:4: no

CNN的經典文章要點總結持續更新

AlexNet(2012) 資料: 輸入要求:256*256 結構包含8層帶權重的層:5層卷積層+3層全連線層 引數:batchsize= 128,momentum=0.9,weight decay=0.0005 具

app崩潰的原因 和 提前測試流程/方法 和出現崩潰後怎麼定位和處理 總結持續更新

首先,崩潰有幾種情況: 閃退 提示停止執行 無響應 ( 不同情況雖然沒有嚴格意義上區分開引起原因,但是都有側重。在之後的工作中,我會實時補充統計。) 1.介面返回值 [直接原因]:ap

史上最全的常用開發工具類收集持續更新

API checkBankCard : 校驗銀行卡卡號是否合法 getBankCardCheckCode: 從不含校驗位的銀行卡卡號採用 Luhm 校驗演算法獲得校驗位 getNameOfBank : 通過銀

iOS 開發學習資料整理持續更新

https://segmentfault.com/a/1190000002473595#articleHeader16 https://github.com/Tim9Liu9/TimLiu-iOS https://github.com/ipader/SwiftGuide 部落格園: http://w

ubuntu14.04 Android/linux開發環境配置總結持續更新

一、更新源方法及地址:1 、首先備份 Ubuntu14.04 源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup  (備份下當前的源列表)2 、修改更新源sudo gedit /etc/apt/sourc

LeetCode 總結 持續更新。。。。

總結 get ngs multiply log 。。 icu ble 更新 No. Name Acceptance Difficulty Star 43 Multiply Strings 27.3% medium 3.5 90 Subsets II 36.5%

golang開發常用開源項目工具持續更新

golang開源項目 golang工具 本人在日常golang項目開發中,用到了一些第三方開源庫,大多都是優秀的開源項目,源碼值得認真閱讀研究。在此記錄用到的一些庫:解析配置文件go-ini https://github.com/go-ini/inigolang開發常用開源項目工具(持續更新中)

總結Spring框架擴充套件點bean生命週期的擴充套件點持續更新...

面向業務開發的時候,程式設計師需要明白業務的邏輯,並設計程式碼結構。而在進行中介軟體開發的時候,則需要明白框架的邏輯,進行開發。 所以要開發提供給spring的中介軟體,需要知道spring中有哪些擴充套件點,好在對應的地方插入我們的功能。 1. Spring容器初始化b

hdoj刷題經驗總結持續更新ing

(語言採用c++)1、輸出如何保留兩位小數#include<iostream>#include<iomanip>using namespace std;void main(){float result=2.355; printf("%.2f\n",re

總結了一些新的面試題,包含答案持續更新

Java根底● 集合類以及集合框架;HashMap與HashTable完成原理,執行緒平安性,hash抵觸及處置演算法;ConcurrentHashMap;- Collection 集合的根介面+Set 繼承類,不能包含重複元素,無序+List 繼承類,可以包含重複元素,

新手android 開發 錯誤集錦持續更新

(1)error opening trace file: No such file or directory (2) 這是寫的第一個程式就出現的問題,而且查詢程式碼沒有發現錯誤。google後得出結論:模擬器版本和android的API版本不對應,相應的進行修改就行。 (2)出現java.lang.Num

LeetCode刷題總結持續更新。。。

1、迴文字元 返回字串是否迴文結構 def huiwen(str): if len(str) == 1: return True elif len(str)