iOS斷點及列印日誌,iOS斷點列印日誌
首先,最簡單的斷點就是在Xcode專案檔中任意一行行號那點一下,就是加了一個斷點
再次點擊會變成淺藍色,表示disable掉了
disable掉的斷點不會起作用,但會在左上方藍色的標籤那留下記錄,這裡記錄下了你設定的所有斷點,然後在這你可以點一下淺藍色的位置enable一些斷點。
刪除斷點只要在斷點位置右鍵點擊Delete Breakpoint就行了;也可以左鍵點住斷點往外拖再鬆掉,會出現一個灰塵氣泡;還可以在標籤那邊的斷點右鍵delete。
設定了一個斷點後,再執行程式,程式編譯到斷點處時會停止,並出現這樣的畫面,在這裡我們可以看到一些參數,self代表當前對象,其他的則是執行到當前語句時這個方法或者說這個棧裡面分配的對象
如果想查看更多個物件的話,點擊左下角選擇all。
在右邊lldb這是一個debug的工具,可以輸入一些命令來列印一些資訊,左邊的資訊可以通過這裡列印出來
可以輸入po(pring project)來列印對象以及p(pring)來列印一些基本類型或者結構體
如果不喜歡命令列,也可以在左邊選擇一行右鍵選擇Pring Description
這樣在右邊也會像命令列一樣在lldb這列印出來
lldb還有很多功能,可以在蘋果官方文檔中輸入lldb查看。
在上方Debug裡面還有很多命令。continue表示繼續運行;continue to current line表示繼續運行到當前行;step over表示不進入當前方法,直接進行下一個方法;step into表示進入到方法中的方法;step out則和step into正好相反的操作。還有step over instruction和step into instruction,instruction表示指令的意思,CPU的指令,如果想單步CPU的指令,可以點擊它們,它們是指令級的step;至於step over thread和step into thread表示只在當前線程當中執行,其它線程都停止執行,這個主要在debug多線程時使用,為了防止其它線程的幹擾。
接下來介紹一些斷點進階一些的用法。
找到一個迴圈,比如for迴圈,在其中設定一個斷點,再右鍵選擇edit breakpoint,對這個斷點進行一些定製,這裡有一些參數,condition表示一個條件,當滿足該條件時程式斷住;ignore表示ignore多少次後斷住;action可以添加一個動作,比如debugger command,可以輸入一個lldb的命令,當程式斷住時執行這個動作;最後一個options選中的話表示不斷住,程式滿足條件執行動作後並不斷住。
有時候我們想要知道某件事情發生的時候斷住,但並不能確定在哪一行代碼,這時候就需要一些更加進階的斷點。在斷點這個介面左下角有個+號,點擊它選擇add exception breakpoint,exception表示異常的意思
然後便出現了一個all exceptions,設定它會出來一些選項,第一個exception可以選擇object-c或c++還有all,一般選擇all就ok了;break可以選擇在拋出異常或處理異常時斷住,預設是拋出;action和options就和前面提到的一樣了。最好在項目中添加一個這樣的斷點以備用。
接下來講一下另一種斷點,在斷點那個介面左下角+號那選擇add symbolic breakpoint,基於符號的斷點
設定它也會出來一些選項,symbol中可以寫一個方法,表示當程式執行到該方法的時候斷住;module表示在類庫或可執行檔程式裡;下面的就和前面講的都一樣了。
以上講的Debug版的斷點,還有release版的斷點,在的中選擇edit scheme
然後在這裡選擇release,在release版中設定斷點運行程式時會進行最佳化,資訊可能不是很有用,順序有時也會和原來不一樣,Debug版則會忠實的按照順序運行,因此release執行速度會比較快,但平常我們開發都使用Debug版,當你的程式要發布時使用release版,保證使用者使用的是你的release版,因為它的效能要優於Debug版,它跑的更快,啟動並執行檔案更小。
有些情況下不適合使用斷點,比如有些bug只在release版裡出現,Debug中正常;多任務,多線程的程式;即時性要求比較高的,比如依賴時間的;用戶端和伺服器架構的;還有進程之間,某個進程依賴你要設定斷點的進程時。這時就要使用另外一種手段,列印log(日誌)。
原生的列印有NSLog,在Debug版和release版都可以列印,Cocoas2d中有一個CCLog在Debug版中能正常列印,在release版中則會執行一個空語句,因為列印是件麻煩事兒,release版得保證效能。
列印時間戳記工具函數:
static double gBaseTime = 0.0;
void logCurTimeStamp(NSString * comment)
{
double cur_time = [[NSDate date] timeIntervalSince1970];
double time_past = cur_time - gBaseTime;
gBaseTime = cur_time;
NSLog(@"[%@] cur time = %.4f", comment, time_past);
}
以上內容來自丁群的視頻,網址是http://www.maiziedu.com/course/cocos2d/246-2161/。