XCode 基本調(diào)試法

這里記錄一下自己學(xué)習(xí)到的一些XCode調(diào)試的方法颈将。這些調(diào)試方法可以讓我們使用XCode編寫代碼進(jìn)行調(diào)試時用起來更順心應(yīng)手。

XCode的調(diào)試方法包括運行時設(shè)置斷點衔蹲,打印到控制臺,手寫命令打印等。

1. 運行時設(shè)置斷點

在XCode中需要觀察的變量所在的代碼處添加斷點注服,可以讓程序運行到這里暫停。這時鼠標(biāo)懸停在變量名處措近,XCode會顯示出該變量的信息溶弟。

斷點的類型分為異常斷點(Exception Breakpoint)和符號斷點(Symbolic Breakpoint)等,在XCode斷點瀏覽器(Breakpoints Navigator)的左下方可以添加這些斷點瞭郑。

符號斷點中的符號可以指方法名稱或函數(shù)名稱辜御。符號斷點可以中斷某個函數(shù)的調(diào)用。用戶還可以添加執(zhí)行斷點的條件屈张。


異常斷點可以使程序在每次發(fā)生異常時擒权,都會被中斷。一般用來捕獲未知異常阁谆。

2. 打印到控制臺

控制臺位于XCode的底端碳抄,用于打印程序運行過程中的輸出信息。在代碼中調(diào)用NSLog函數(shù)场绿,可以打印變量值到控制臺中顯示出來剖效。

NSLog(@"obj:%@", obj);

需要特別注意的是,盡管NSLog可圈可點,但在實際應(yīng)用中要防備其可能會引起安全問題璧尸,因為任何由NSLog輸出的內(nèi)容都會成為應(yīng)用程序成品代碼

的一部分咒林,也就是說會被任何接觸到應(yīng)用的人看到。只要把設(shè)備接入信息管理工具爷光,每個人都能查看控制臺信息并查詢每一條日志記錄垫竞。這可能會引發(fā)一系列嚴(yán)重后

果,例如向控制臺輸出機(jī)密邏輯算法或者用戶密碼等信息瞎颗。

我們可以使用宏來解決調(diào)用NSLog方法可能導(dǎo)致的安全問題件甥,只在調(diào)試版本中調(diào)用NSLog『甙危可以采用全局可訪問的頭文件引有,把所有日志記錄都灌進(jìn)去,而且不用擔(dān)心它們會出現(xiàn)在成品代碼當(dāng)中倦逐。

#ifdef DEBUG#define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])#else#define DMLog(...) do { } while (0)

現(xiàn)在如果我們使用DMLog(這個名稱可以隨便起)譬正,它將只向調(diào)試版本輸出結(jié)果,任何成品代碼都不會受到影響檬姥。PRETTY_FUNCTION也幫上了大忙曾我,它會根據(jù)日志信息來源為函數(shù)命名。

3. 在控制臺端手寫命令打印

如果我們在應(yīng)用的特定點進(jìn)行中斷健民,一般來說是為了檢查對象的當(dāng)前狀態(tài)抒巢。Xcode為我們提供了一套“variables view(變量視圖)”,該視圖位于Xcode底部秉犹,與控制臺相鄰的左方區(qū)域蛉谜。理論上講它的作用是顯示與當(dāng)前環(huán)境相關(guān)的所有值的實時狀態(tài),但在實踐中有時無法列出值崇堵,或者是并未將值更新為中斷時的最新狀態(tài)型诚。幸運的是,我們可以利用一些非常實用的控制臺(console)命令自己進(jìn)行對象檢查工作鸳劳。1

po 命令:為 print object 的縮寫狰贯,顯示對象的文本描述。使用p 命令來處理純量值赏廓,即原生類型(boolean涵紊、integer、float等)幔摸。

print 命令:有點類似于格式化輸出摸柄,可以輸出對象的不同信息。

expr 表達(dá)式:打印表達(dá)式抚太。

info 命令:我們可以查看內(nèi)存地址所在信息塘幅。

info line *內(nèi)存地址:可以獲取內(nèi)存地址所在的代碼行相關(guān)信息昔案。

show 命令:顯示 GDB 相關(guān)的信息。如:show version 顯示GDB版本信息电媳。

bt: 顯示當(dāng)前進(jìn)程的函數(shù)調(diào)用棧的情況踏揣;”up num”:查看調(diào)用的詳細(xì)信息;down:返回棧列表匾乓;l:顯示詳細(xì)代碼信息捞稿;p:輸出數(shù)值。

help 命令:如果忘記某條命令的語法了拼缝,用來獲取幫助信息娱局。

需要注意的是,上述這些都是GDB的調(diào)試命令咧七,在LLDB中會有所差異衰齐。隨著Xcode 5的發(fā)布,LLDB調(diào)試器已經(jīng)取代了GDB继阻,成為了Xcode工程中默認(rèn)的調(diào)試器耻涛。

這里需要強(qiáng)調(diào)的一個技巧是,通過使用expr 表達(dá)式可實現(xiàn)在運行時修改變量的值瘟檩。2

expr username = @"username"expr password = @"badpassword"

通過上面的代碼段抹缕,變量username和password分別被重新賦值。

4. 設(shè)置NSZombieEnabled墨辛、MallocStackLogging卓研、NSAutoreleaseFreedObjectCheckEnabled、NSDebugEnabled

第一種設(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.

使用場景:

主要為了解決EXC_BAD_ACCESS問題奏赘,MallocStackLogging用來啟用malloc記錄(使用方式 malloc_history${App_PID}${Object_instance_addr})。

第二種設(shè)置方法:

直接通過Editing Scheme窗口中的Run選項下的Diagnostics選項卡來設(shè)置带膀。

需要注意的問題:

NSZombieEnabled只能在調(diào)試的時候使用志珍,千萬不要忘記在產(chǎn)品發(fā)布的時候去掉橙垢,因為NSZombieEnabled不會真正去釋放dealloc對象的內(nèi)存垛叨。

5. 重寫respondsToSelector方法

實現(xiàn)方式

#ifdef _FOR_DEBUG_-(BOOL) respondsToSelector:(SEL)aSelector {? ? printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);return[super respondsToSelector:aSelector]; }#endif

使用方法:

需要在每個object的.m或者.mm文件中加入上面代碼(應(yīng)該可以使用類屬實現(xiàn)),并且在other c flags中加入-DFOR_DEBUG(記住請只在Debug Configuration下加入此標(biāo)記)柜某。這樣當(dāng)你程序崩潰時嗽元,XCode的console上就會準(zhǔn)確地記錄了最后運行的object的方法。

http://mobile.51cto.com/iphone-377138.htm“iOS故障排除指南:基本技巧”

http://my.oschina.net/notting/blog/115294“Xcode LLDB Debug教程”

http://www.2cto.com/kf/201210/162934.html“Xcode調(diào)試攻略”

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喂击,一起剝皮案震驚了整個濱河市剂癌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翰绊,老刑警劉巖佩谷,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旁壮,死亡現(xiàn)場離奇詭異,居然都是意外死亡谐檀,警方通過查閱死者的電腦和手機(jī)抡谐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桐猬,“玉大人麦撵,你說我怎么就攤上這事±7荆” “怎么了免胃?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惫撰。 經(jīng)常有香客問我羔沙,道長,這世上最難降的妖魔是什么厨钻? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任撬碟,我火速辦了婚禮,結(jié)果婚禮上莉撇,老公的妹妹穿的比我還像新娘呢蛤。我一直安慰自己,他們只是感情好棍郎,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布其障。 她就那樣靜靜地躺著,像睡著了一般涂佃。 火紅的嫁衣襯著肌膚如雪励翼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天辜荠,我揣著相機(jī)與錄音汽抚,去河邊找鬼。 笑死伯病,一個胖子當(dāng)著我的面吹牛造烁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播午笛,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼惭蟋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了药磺?” 一聲冷哼從身側(cè)響起告组,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癌佩,沒想到半個月后木缝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體便锨,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年我碟,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸿秆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡怎囚,死狀恐怖卿叽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恳守,我是刑警寧澤考婴,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站催烘,受9級特大地震影響沥阱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伊群,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一考杉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舰始,春花似錦崇棠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谜嫉,卻和暖如春萎坷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沐兰。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工哆档, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人住闯。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓瓜浸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寞秃。 傳聞我的和親對象是個殘疾皇子斟叼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容