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, nil, NSStringFromClass([AppDelegate class]));
}
}
@catch (NSException *exception) {
NSLog(@"Stack Trace:%@",[exception callStackSymbols]);
}
所有的異常最後都會拋出到main函數中。查看輸出的異常日誌。
3 BreakPointTest 0x000df6fb -[ViewController viewDidLoad] + 446
7.調試問題彙總
1.如果能夠捕獲到異常使用異常分析機制,或者查看崩潰日誌
2.如果無法捕獲異常,也沒有輸出則需要保證方法不要重複調用,否則可能引起內存問題。