ios基礎之調試篇

 1.常用3種斷點

文件行斷點:在某一行代碼處的斷點

符號斷點:可以定位到某些方法

異常斷點:可以在拋出或者捕獲異常時調用,可以選擇不同的語言(c/c++/object-c)

swift斷點:捕捉swift中的錯誤

測試失敗的斷點:還未嘗試過.


2.拋出異常:使用斷言NSAssert

NSAssert(i<95@"i=%d已經大於95",i);

還能使用NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5.


3.發佈時移除NSAssert

步驟:

爲工程添加一個新的scheme,命名最好不同;

編輯這個新的scheme,在Info選項->Build Configuration 下改爲release,爲發佈而配置。

在新的scheme下,進入Target->Build Settings->Apple LLVM 7.0-Preprocessing->Preprocessor Macros目錄下;

爲release選項添加NS_BLOCK_ASSERTIONS即可。

(注:NS_BLOCK_ASSERTIONS是Foundation框架中定義好的預處理宏)


4.發佈時移除NSLog

基本思路是用一個新的輸出的宏取代NSLog,如果是已有的工程可能工作量比較大.

在pch文件中加入新的宏:

/*

#ifdef  DEBUG

#     define DLog(...) NSLog(__VA_ARGS__)

#else

#     define DLog(...)

#endif

*/

注意__VA_ARGS__前後是長橫。

同樣進入進入Target->Build Settings->Apple LLVM 7.0-Preprocessing->Preprocessor Macros目錄下,

將Debug改爲DEBUG或者DEBUG=1.(新的系統下應該可以省略這一步)

記得以後輸出時統一使用DLog即可.


5.使用LLDB調試工具

進入LLDB工具:設置一個斷點,運行到斷點時,將All Output改爲Debugger Output.

 5.1 使用命令設置斷點(在第30行):

(lldb) breakpoint set --file ViewController.m --line 31

(lldb) br s -f ViewController.m -l 30

(lldb) b ViewController.m:31

如果要在所有用某個方法調用時掛起(符號斷點),命令如下:

(lldb) breakpoint set --selector findAll

(lldb) br s -S findAll

查看斷點:

(lldb) breakpoint list

(lldb) br l

刪除斷點(每個斷點都有編號):

(lldb) breakpoint delete

(lldb) br del

單步進入:

(lldb) thread step-in

(lldb) step

(lldb) s

單步跳過:

(lldb) thread step-over

(lldb) next

(lldb) n

繼續運行:

(lldb) thread continue

(lldb) continue

(lldb) c

5.2   觀察點變化(可以查看變量的變化)

設置觀察點

(lldb) watchpoint set variable sum

(lldb) wa s v sum

查看觀察點

(lldb) watchpoint list

(lldb) watch l

刪除觀察點(沒有編號則會刪除所有觀察點)

(lldb) watchpoint delete 觀察點編號

(lldb) watch delete 觀察點編號

(lldb) watch del 觀察點編號

5.3查看變量和計算表達式命令

(lldb) frame variable

(lldb) fr v

單個變量

(lldb) frame variable sum

(lldb) fr variable

(lldb) fr v

(lldb) print sum

查看全局變量

(lldb) target variable

(lldb) ta v

計算基本數據類型表達式

(lldb) expression sum

(lldb) expr sum

(lldb) p sum  //打印單個變量

計算對象數據類型表達式

(lldb) expression -o -- self.textArray[0]

(lldb) po self.textArray[2]


6.異常堆棧報告分析

將main函數改爲如下

    @try {

        @autoreleasepool {

            return UIApplicationMain(argc, argv, nilNSStringFromClass([AppDelegate class]));

        }

    }

    @catch (NSException *exception) {

        NSLog(@"Stack Trace:%@",[exception callStackSymbols]);

    }

所有的異常最後都會拋出到main函數中。查看輸出的異常日誌。

3   BreakPointTest                      0x000df6fb -[ViewController viewDidLoad] + 446


7.調試問題彙總

1.如果能夠捕獲到異常使用異常分析機制,或者查看崩潰日誌

2.如果無法捕獲異常,也沒有輸出則需要保證方法不要重複調用,否則可能引起內存問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章