1. xcode內(nèi)置gdb,可以使用gdb調(diào)試,調(diào)試命令:
1.1 po 命令:為 print object 的縮寫(xiě),顯示對(duì)象的文本描述
(lldb) po [$eax class]:輸出異常對(duì)象的地址
(lldb) po [$eax name]:輸出這個(gè)異常的名字
(lldb) po [$eax reason]:這個(gè)將會(huì)輸出錯(cuò)誤消息:
(lldb) “po $eax”:對(duì)這個(gè)對(duì)象調(diào)用“description”方法和打印出來(lái)
“$eax”是cup的一個(gè)寄存器。在一個(gè)異常的情況下,這個(gè)寄存器將會(huì)包含一個(gè)異常對(duì)象的指針。注意:$eax只會(huì)在模擬器里面工作,假如你在設(shè)備上調(diào)試,你將需要使用”$r0″寄存器
1.2 print 命令:有點(diǎn)類(lèi)似于格式化輸出,可以輸出對(duì)象的不同信息
比如:print (char*)[[dic description] cstring]、(lldb) print (int)[label retaincount]
1.3 info 命令:我們可以查看內(nèi)存地址所在信息
1.4 info line *內(nèi)存地址:可以獲取內(nèi)存地址所在的代碼行相關(guān)信息
1.5 show 命令:顯示 gdb 相關(guān)的信息。如:show version 顯示gdb版本信息
1.6 bt: 顯示當(dāng)前進(jìn)程的函數(shù)調(diào)用棧的情況;up num:查看調(diào)用的詳細(xì)信息;down:返回棧列表;l:顯示詳細(xì)代碼信息;p:輸出數(shù)值。
2. 添加全局?jǐn)帱c(diǎn)(add exception breakpoint):
2.1 添加步驟:
1. in the bottom-left corner of the breakpoints navigator, click the add button.
2. choose add exception breakpoint.
3. choose the type of exception from the exception pop-up menu.
4. choose the phase of the exception handling process at which you want program execution to stop.
5. click done.
2.2 使用場(chǎng)景:
程序因?yàn)閟igabrt而crash,想要定位到導(dǎo)致crash的行。
3. 添加符號(hào)斷點(diǎn)(add symbolic breakpoint):
3.1 斷點(diǎn)執(zhí)行的時(shí)機(jī):symbolic breakpoints stop program execution when a specific function or method starts executing
3.2 添加步驟:
1. steps in the bottom-left corner of the breakpoint navigator, click the add button.
2. choose add symbolic breakpoint.
3. enter the symbol name in the symbol field.
4. click done.
3.3 使用場(chǎng)景:
當(dāng)想讓系統(tǒng)在某個(gè)指定條件處中斷時(shí),設(shè)置相應(yīng)的斷點(diǎn)。
比如:
objc_exception_throw:在系統(tǒng)拋出異常處設(shè)置斷點(diǎn)。
-[nsexception raise]:
4. 設(shè)置nszombieenabled、mallocstacklogging、nsautoreleasefreedobjectcheckenabled、nsdebugenabled:
4.1 設(shè)置方法:
1. product->edit scheme...->run...->environmentvariables.
2. add nszombieenabled,set the value with yes
3. add mallocstacklogging, set the value with yes.
4. add nsautoreleasefreedobjectcheckenabled, set the value with yes.
5. add nsdebugenabled, set the value with yes.
4.2 使用場(chǎng)景:
主要為了解決exc_bad_access問(wèn)題,mallocstacklogging用來(lái)啟用malloc記錄(使用方式 malloc_history ${app_pid} ${object_instance_addr})。
4.3 需要注意的問(wèn)題
nszombieenabled只能在調(diào)試的時(shí)候使用,千萬(wàn)不要忘記在產(chǎn)品發(fā)布的時(shí)候去掉,因?yàn)閚szombieenabled不會(huì)真正去釋放dealloc對(duì)象的內(nèi)存。
5. 重寫(xiě)respondstoselector方法
5.1 實(shí)現(xiàn)方式
#ifdef _for_debug_
-(bool) respondstoselector:(sel)aselector {
printf(selector: %sn, [nsstringfromselector(aselector) utf8string]);
return [super respondstoselector:aselector];
}
#endif
5.2 使用方法:
需要在每個(gè)object的.m或者.mm文件中加入上面代碼(應(yīng)該可以使用類(lèi)屬實(shí)現(xiàn)),并且在other c flags中加入-d _for_debug_(記住請(qǐng)只在debug configuration下加入此標(biāo)記)。這樣當(dāng)你程序崩潰時(shí),xcode的console上就會(huì)準(zhǔn)確地記錄了最后運(yùn)行的object的方法。
更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄