一、Xcode 調(diào)試技巧之:NSLog
上面也提到了,在我們?nèi)粘5拈_(kāi)發(fā)過(guò)程中最常?的Debug方式就是打Log。而在OC語(yǔ)言中,打Log是采用NSLog方 法。但是NSLog效率低下,具體原因可以看這篇博客( NSLog效率低下的原因及嘗試lldb斷點(diǎn)打印Log)。所 以在平時(shí)的開(kāi)發(fā)過(guò)程中,能不打Log就不打Log。實(shí)在想打Log網(wǎng)上也有對(duì)NSLog的一些優(yōu)化方法,可以閱讀王巍 的《宏定義的黑魔法 - 宏菜?起?手冊(cè)》如下代碼便出自其中
#ifdef DEBUG
#define NSLog(format, ...) printf("[%s] %s [%d] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(format, ...)
#endif
另外在使用NSLog的時(shí)候應(yīng)當(dāng)注意,release版本中應(yīng)該要去掉NSLog。
2、Xcode調(diào)試技巧之:LLDB
LLDB
全稱Low Level Debugger
,并不是低水平的調(diào)試器,而是輕量級(jí)的高性能調(diào)試器
,默認(rèn)內(nèi)置于Xcode中。LLDBDebug
在編譯后就是一個(gè) Macho
的可執(zhí)行文件,也可理解為 鏡像文件
,image
并不是圖像的意思,而是代表鏡像
。這里跟上我們自己的工程名,即用image定位尋址
才是尋找我們自己的代碼。
1. p 和po 命令
p 命令是 print 的縮寫(xiě),查看基本數(shù)據(jù)類型的值,如果使用p命令查看的事對(duì)象,那么只會(huì)返回對(duì)象的額指針地址,p 命令后面除了可以接收變量,常量,還可以接 表達(dá)式。
po:print object的縮寫(xiě),表示顯示對(duì)象的文本描述,如果對(duì)象不存在則打印nil。
?p 和 po 都不可以使用宏?
簡(jiǎn)單的打印一個(gè)對(duì)象我們就不說(shuō)了,我們來(lái)說(shuō)說(shuō)特殊的應(yīng)用場(chǎng)景吧!
應(yīng)用場(chǎng)景:你想知道一個(gè)視圖包含了哪些子視圖。當(dāng)然你可以循環(huán)打印子視圖,但是下面只需要一個(gè)命令即可解決。
輸出視圖層級(jí)關(guān)系(這是一個(gè)被隱藏的命令): `po [[self view] recursiveDescription] `
2. call:執(zhí)行一段代碼
call NSLog(@"%@", @"yang")
3. expr:動(dòng)態(tài)執(zhí)行指定表達(dá)式expr i = 101
輸出: (int)$0 = 101
4. bt:打印當(dāng)前線程堆棧信息
如果要打印所以線程堆棧信息,使用:bt all即可。
使用bt 命令可以查看函數(shù)調(diào)用堆棧,使用bt all 可以查看所有堆棧信息,然后使用frame select 即可查看對(duì)應(yīng)函數(shù)詳細(xì),同時(shí)配合up
和down命令追蹤函數(shù)的調(diào)用和被調(diào)用關(guān)系。演示如下:
5. image:常用來(lái)尋找棧地址對(duì)應(yīng)代碼位置:
舉個(gè)栗子:
應(yīng)用場(chǎng)景數(shù)組越界模擬代碼,報(bào)錯(cuò)后執(zhí)行:image lookup --address 0x00000001035230ae
** 6. x命令
x命令是查看地址在內(nèi)存的情況,一般查看對(duì)象地址和對(duì)象的屬性地址
x/4gx命令:打印4個(gè)16進(jìn)制地址。
x/8gx命令:打印8個(gè)16進(jìn)制地址。
關(guān)于LLDB 其他使用可以學(xué)習(xí):
iOS之Xcode斷點(diǎn)調(diào)試
LLDB官網(wǎng)
三、Xcode調(diào)試技巧之:斷點(diǎn)調(diào)試(breakpoint)
Xcode斷點(diǎn)分以下幾種:
Xcode工具欄切換到斷點(diǎn)處,選擇左下角 + 號(hào):
可以看到斷點(diǎn)類型:
- Swift Error Breakpoint
- Exception Breakpoint
- OpenGL ES Error Breakpoint
- Symbolic Breakpoint
- Constraint Error Breakpoint
- Test Failure Breakpoint
3.1 Breakpoint(斷點(diǎn))調(diào)試
看這6種斷點(diǎn)之前,先來(lái)介紹一下,如何編輯斷點(diǎn):
根據(jù)需要加斷點(diǎn),鼠標(biāo)在斷點(diǎn)上右鍵:
可以看到上圖五種類型:
- Edit Breakpoint
- Disable Breakpoint
- Disable Other Breakpoints
- Delete Breakpoint
- Reveal in Breakpoint Navigator
1. Edit Breakpoint
點(diǎn)擊Edit Breakpoint后(使用比較頻繁):
可以看到有5種操作條件:
- name (斷點(diǎn)名稱)
- Condition(條件)
- Ignore(忽略)
- Action(執(zhí)行語(yǔ)句)
- Options
(1) Name 和 Condition
Condition可以輸入一個(gè)條件表達(dá)式,如果條件滿足了,就會(huì)觸發(fā)斷點(diǎn),例如:
使用比較頻繁,往往在處理數(shù)據(jù)時(shí)for循環(huán)找到指定對(duì)象時(shí)用到,當(dāng)然還有其他用法,因場(chǎng)景而異。
(2) Ignore
設(shè)置忽略斷點(diǎn)的次數(shù),比如設(shè)置2,在上述例子中,會(huì)忽略前兩次次for循環(huán),而在第三次時(shí)觸發(fā)斷點(diǎn)
(3) action
點(diǎn)擊 Action
默認(rèn)是Debugger Command (會(huì)記憶你上次選擇的類型),點(diǎn)擊會(huì)有6種類型。
- AppleScript
- Gapture GPU Workload
- Debugger Command
- Log Message
- Shell Command
- Sound
功能Debugger Command和Log Message比較常用
1.AppleScript
會(huì)在斷點(diǎn)觸發(fā)的時(shí)候執(zhí)行Mac OS X內(nèi)置的一種功能強(qiáng)大的腳本語(yǔ)言。
2.Gapture GPU Gapture GPU Workload
調(diào)試跟GPU相關(guān)的問(wèn)題:
3.Debugger Command
可以輸入LLDB命令:
我們常常使用expr(expression簡(jiǎn)寫(xiě),兩種寫(xiě)法lldb都會(huì)識(shí)別)在斷點(diǎn)處強(qiáng)行修改變量值
4.Log Message
%B輸出斷點(diǎn)的名稱
%H輸出斷點(diǎn)執(zhí)行的次數(shù)
@@之間輸入表達(dá)式,比如(@5*2@ 會(huì)輸出結(jié)果10,也可以輸出對(duì)象結(jié)果)
勾選Log message to console,會(huì)在控制臺(tái)輸出結(jié)果。
勾選Speak message,不會(huì)在控制臺(tái)輸出,但是會(huì)朗讀處結(jié)果(用的少)。
5.Shell Command
點(diǎn)擊Choose,選擇寫(xiě)好的腳本文件,觸發(fā)斷點(diǎn)時(shí)會(huì)執(zhí)行所選擇的腳本
6.Sound
會(huì)在斷點(diǎn)處觸發(fā)聲音,如下圖,有14中聲音。
(4) Options
勾選Automatically continue after evaluating actions
之后程序會(huì)在斷點(diǎn)產(chǎn)生后繼續(xù)運(yùn)行。一般用于斷點(diǎn)處修改值,或者輸出斷點(diǎn)信息時(shí)會(huì)勾選此選項(xiàng),運(yùn)行時(shí),斷點(diǎn)生效,但是斷點(diǎn)處不停。如圖,執(zhí)行for循環(huán)結(jié)束,斷點(diǎn)處并沒(méi)有停留。
3.2 Disable Breakpoint
點(diǎn)擊Disable Breakpoint后會(huì)使斷點(diǎn)失效,但斷點(diǎn)依然保留,顏色會(huì)邊淺色(快速使斷點(diǎn)失效方法:鼠標(biāo)單擊斷點(diǎn))。
再次鼠標(biāo)在斷點(diǎn)處右鍵:
點(diǎn)擊Enable Breakpoint斷點(diǎn)重新生效(快速使斷點(diǎn)生效方法:鼠標(biāo)單擊斷點(diǎn))。
3.3 Disable Other Breakpoints
點(diǎn)擊Disable Other Breakpoints 快速將其他斷點(diǎn)設(shè)為無(wú)效狀態(tài)。這個(gè)蠻好用的
3.4 Delete Breakpoint
點(diǎn)擊Delete Breakpoint刪除斷點(diǎn)(快速刪除斷點(diǎn)方法:鼠標(biāo)左建按住斷點(diǎn)拖走松開(kāi)鼠標(biāo),即刪除斷點(diǎn))。
3.5 Reveal in Breakpoint Navigator
點(diǎn)擊Reveal in Breakpoint Navigator,會(huì)切換到導(dǎo)航斷點(diǎn)處文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-758457.html
參考資料
iOS之Xcode斷點(diǎn)調(diào)試
LLDB官網(wǎng)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-758457.html
到了這里,關(guān)于iOS開(kāi)發(fā)之Xcode常用調(diào)試(Debug)技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!