iOS各類調試技巧豪華套餐(上)

 

前言程序員

最近博主臨近畢業季,爲了完美的寫一篇畢業論文,真是:「鋤禾日當午,汗滴禾下土」<—— 這句詩跟畢業我寫畢業論文沒任何一毛錢關係,我就是忽然想吟溼了。不過博主做爲網絡工程專業的好青年,曾經的願望和理想就是在下水道幹出一番轟轟烈烈的大事業,沒錯是就是下水道,咱們的征途在下水道!!不過你們別誤會,我不是忍者龜的腦殘粉!聽我繼續說!我想的是等我在各大排水系統各大下水道功成名就的時候,我就能夠指着一個井蓋對個人孫子說:「諾 那個下面的通訊光纜是爺爺我接的!!」 我滿臉自豪地接受着這孫子的敬仰!可是啊,曾經的願望都實現不了了,我深深愛着的地下通訊光纜啊,曾經多少個夜晚淚水打溼了個人畢業論文,渲染開的筆墨那都是哥逝去的青春啊。網絡

由於生活就像開了博主一個玩笑,讓博主遇到了一種雞,那是一種特殊品種的雞,它叫作逼優雞!!就是這隻雞讓博主平白無故的成了一隻APM超200的野生究極程序猿!!吼~ 嗷~,把博主帶離了下水道!而且與這隻雞踏上另外一端征途!臨走的時候,下水道的通訊光纜就交給大家了,肥皂基友們(網絡工程的基友們)!!我靠,他們居然在打印店花了50塊錢就直接買了一套深度豪華畢業論文套餐!裏面包含了論文,工程製圖,CAD,報價清單,拓撲結構……最重要的是老闆承諾不需任何修改,直接能夠經過畢業答辯,不經過來年免費再提供一套論文,最貼心的是居然支持經過再付款!!,學習

圖1spa

老子寫論文寫了半個月像狗同樣,他們居然直接就買了!就這麼買過去了!!對得起老師的諄諄教誨、本身的辛苦付出和父母的期待麼?我就問大家慚愧不慚愧?爲何買的時候不喊上我?淚已淌幹~debug

逼優雞調試

終於來到了你們期待的正片,今天我就要和你們講我和逼優雞的故事,逼優雞它優雅低調,它身材玲瓏,藏匿在黑暗處,挑動着個人慾望!曾多個日夜博主都……(擦!尼瑪,逼優雞是什麼鬼?說好的技術文章?)同窗你真的(biè)急,你先坐下,先把鞋子穿好!我說的逼優雞它的英文名叫作(Bug),它挺(T)美(M)的(D)……code

歌仔唱的好:orm

多少猿曾被它奪走年輕的容顏對象

多少猿曾在它面前亮門禿了頭生命週期

多少Bug曾經生命中來了又還

可知一輩子有你我都陪在你身邊

圖2

無數個夜晚你揪着頭髮和Bug撕咬的情景博主能夠體會,因此此次的這篇文章博主就要給你們整理一個調教IOS逼優雞的方法豪華套餐!!放心!絕對的深度豪華,由於已經加入肯德基豪華午飯~咳咳~實際上是由於逼優雞(Bug)對於咱們畢竟是除了老婆以外第二可怕的存在!咱們必需要練就銅頭鐵臂十八般武藝,祭練奇門巧技各類大殺!方可與之周旋並將之殲滅!好!跟着博主一塊兒裝逼一塊兒飛吧!!!!

第一步:

我看你們蓬頭垢面的就知道你們剛剛也才debug回來 ,咱們就先寫個hello world壓壓驚把!

第二步

……

知己知彼 百戰不殆

此處爲大量Copy!不喜請噴!

The software doesn't do something that the product specification says it should do.

The software does something that the product specification says it shouldn't do.

The software does something that the product specification doesn't mention.

The software doesn't do something that the product specification doesn't mention but should.

The software is difficult to understand, hard to use, slow, or in the software tester's eyes will be viewed by the end user as just plain not right.

我不是英文教師,請你們自行切換多語言閱讀模式。

也還有有人粗暴的定義 」Bug就是錯誤「,除了世界上第一隻Bug是飛進去的那隻蟲子外,其餘Bug毋庸置疑那都是程序員們本身生下來的!程序員們本身犯的錯誤!若是說一個軟件做品(請尊重你本身的做品,不要喊他們」產品」或者」項目」)是程序員們本身的孩子,那麼Bug就是這個孩子的生的病,有病得治,藥不能停!生病有各類治療方法,物療,理療,化療,心理療……那麼「治療」Bug也是有多中方法的!下面博主會一一列舉!懲治這些個Bug以前,博主要先阿拉巴拉一番,遇到Bug也是一件比較嗶了狗了的事情,你要知道任何人都會生病,沒有例外!全部任何代碼都有Bug這是定理,咱們首先要從心態上端正Bug這件事情,咱們能夠理解爲缺憾也是一種美,就像阿雨說的「沒有皺紋的祖母是可怕的,沒有白髮的老者是讓人遺憾的。沒有廢墟的人生太累了,沒有廢墟的大地太擠了,掩蓋廢墟的舉動太僞詐了。」Debug是爲了證實程序有錯,而不是證實程序無錯誤;因此咱們要作到臨Bug而不懼者,聖人之勇也!因此咱們要作到戰略上藐視它,戰術上重視它!你要心理默唸Bug其實挺(T)美(M)的(D)!anyway 無Bug不生活!!

抽刀斷Bug

斷點,(我求大家不要想到張敬軒,阿軒他容易麼,小受又怎麼了?大家這幫人真是的!!),我要說的斷點是BreakPoint!基本上不是殘廢的IDE都具備斷點調試功能吧!尤爲是XCode,咱們家的IDE斷點調試功能但是強中又是強中手!在這以前你們能夠先了解一下哈子是斷點?它怎麼實現的?工做原理怎麼樣的?博主就獻醜說說本身的理解吧,斷點,顧名思義就是從前有一個點,後來它斷了,謝謝,個人故事講完了。哎喲還不服,這些基礎常識的東西本身不會查?你還真的臉皮厚上天了去了,還要博主給你查喲,本身查去!

普通操做

如圖3

基本的斷點操做以下

圖4

點擊那個黑列列就建立了一個斷點,再次點擊就臨時取消這個斷點(可是不刪除),長按那個斷點拖出去就刪除了(mac os的系統工程師就是稀飯拖動的快感),固然也能夠右鍵那個建立的斷點,會彈出相應地菜單。

固然也還能夠監視某個變量!

圖5

在對象視圖中,右鍵某個對象,點擊「Watch ‘XXX’」就完成XXX對象的監視了。

這裏我監視了lab這個UILabel的變量,每當這個變量進行更新它的信息就會被打印到控制檯。

好吧!咱們最基本的建立斷點的工做已經學會了,Xcode舒服在什麼地方呢?就是不分Debug模式和Run模式的,能夠說是無縫切換的,你只要沒有建立斷點,那麼就是Run的正常模式,若是建立了斷點而且運行到斷點處,就自動進入Debug模式咯,不像某EC開頭的IDE,控制面板就像開飛機的同樣,幾萬個按鈕覺得很強大,其實只用了Run和Stop,還有什麼Debug模式,App模式……,果真Xcode的優越感在對比中更增強烈了,舒服到極點呀,就像夏天的海風拂過菊花,嗯是的 就是那種感受!

咱們建立好了斷點,運行到斷點就自動停下來了,像這樣:

圖6

這些Debug的最基本操做技能是每個入門的IOS開發者都要掌握的,應該當成一種本能,就像狗愛吃翔同樣(噢 對不起 博主不是歧視狗的意思,博主也養過狗,很二逼可是從不吃翔!真的據我所知它歷來不吃翔的,這裏只是比喻只是比喻)。

全局斷點(Global BreakPoint)

有時候在程序出錯的時候不能能準肯定位到奔潰的那一行代碼,而是直接跑到main循環或者Appdelegate裏面, 或者會給你這樣的提示:

EXEC_BAD_ACCESS:

是否是有種想哭的衝動?尼瑪~至少給我一些堆棧信息也好呀~……這個時候你千萬不要砸鼠標和鍵盤哦,一切都是主機在運行,你砸鼠標和鍵盤有什麼用呢?應該是踢主機呀~~,如今有了全局斷點,孃親不再擔憂你砸鼠標了,你只須要這樣:

圖7

在Debug導航面板進行上圖的操做,你就創建了全局斷點,這樣只要遇到錯誤,debug程序就會自動定位到棧底的信息,也就是你最早出錯的代碼的那一行,這樣你就能夠快樂的debug拉~~

條件斷點(Condational Breakpoints)

從前有一個遊戲,叫作擼啊擼,有些玩家他們知道怎麼操做,會放技能會走路,可是他們不知道買裝備,玩了一局下來,鞋子小刀都沒有買。我爲何講這個故事呢?由於不少小朋友學東西和玩遊戲同樣,看完前面的幾種調試技能,就覺得本身已經屌爆無敵了,其實他們不過是出門不帶裝備的玩家,若是隻是使用了以上的調試技能只能說是低玩,在高大的逼優雞面前根本就是會被瞬秒的那種,因此學會裝備本身才是王道!條件斷點,就是學會有的放矢!

咱們來看一段代碼

圖8

你是否是想問博主爲什麼那麼風騷,居然上了Swift了!!我此刻只想吟一首溼:別人笑我太淫蕩,我家住在黃鶴樓。

反正這個年代你們都是吃飽了撐着的,博主也是,因此就學學Swift咯。

咱們若是在一個循環裏面使用了斷點,若是這個循環執行了100萬次,那你的斷點要執行那麼屢次,你不以爲蛋蛋都涼了的憂傷麼?因此咱們這麼作:

圖9

這樣只有遍歷到c==「H」的時候 斷點纔會被觸發。

圖10

是否是很棒呢!

有些童鞋的鈦合金狗眼已經看到了編輯斷點那裏有一個Action的東西,那是什麼呢?

這個是很是強大的,能夠在你斷點的位置,執行各類操做,好比執行腳本命令,控制檯命令(能夠制定調試信息自定義保存)、打印信息等,
博主最喜歡的就是這個Log message啦,簡單粗暴!根本就不須要print啊NSLog嘛,直接在斷點的Action打印就行了(其實這個是Xcode和調試器結合的高能產物,下面再介紹)。具體能夠這樣:

圖11

其實剛剛博主撒謊了,博主最喜歡的Action並非Log Message,而是Sound,顧名思義嘛,斷點射在Bug上,這樣遇到斷點就會發出聲音,聽到我本身設置的聲音,我就知道是什麼Bug了,聽聲識Bug,呵呵,EXEC_BAD_ACCESS的錯誤我設置成了波多野老師的聲音,unrecognized selector send to instancd的錯誤我設置成了蒼老師的…… 不要問我係統怎麼沒有吉澤明步的聲音,我根本就不知道誰是吉澤明步。

固然還有更增強大的條件斷點就是這貨啦

圖12

添加以後在 Symbol 一欄輸入 viewDidLoad。

這樣一來,在程序中全部的 viewDidLoad 方法被調用時都會觸發斷點。

圖13

固然,咱們也能夠僅僅爲特定的某個類的方法添加斷點。在 Symbol 一欄輸入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 便可。

好比:unrecognized selector sent to instance 0xaxxxx 這種錯誤,這個instance能夠這樣快速定位

圖14

打印的藝術

儘管ARC已經讓內存管理變得簡單、省時和高效,可是在object的life-cycles中跟蹤一些重要事件依然十分重要。畢竟ARC並無徹底排除內存泄露的可能性,或者試圖訪問一個被release的對象。爲了這個目的,咱們能夠很藝術地偷窺對象正在作些什麼,想一想就好有快感。

NSLog

小夥伴們第一節課學習ViewController的生命週期的時候,老師確定很猥瑣的教了你們,在viewController的每一個生命週期的方法中使用了NSLog來偷窺!沒錯,這樣其實就是最簡單爆炸的跟蹤生命週期的方法了,不過系統本身的NSLog真心有點羸弱,輸出的信息太少,根本就不能知足咱們的慾望,這裏我教你們強化你的Log!!

能夠用下面的這段宏

//A better version of NSLog
#define NSLog(format, ...) do { \
fprintf(stderr, "<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
} while (0)

關於宏的威力 你們能夠亂入個人博文《 IOS中的預編譯指令的初步探究》

這樣打印出來的東西纔像話嘛(其實NSLog的打印是很是低效的,甚至比print低100倍,感興趣本身翻翻蘋果手冊咯)。 

使用objc語言(強類型)而且用NSLog打印的時候,經常搞不清楚NSLog(@「%?」,xxx) xxx這種類型該是什麼什麼類型輸出,應該是%d呢仍是%@亦或是%f???傻傻分不清楚~,因此玩轉NSLog你應該要知道如下這幾個全局方法!

圖17

開啓殭屍對象(Enable NSZombie Objects)

Xcode能夠把那些已經release掉得對象,變成「殭屍」,當咱們訪問一個Zombie對象時,Xcode能夠告訴咱們正在訪問的對象是一個不該該存在的對象了。由於Xcode知道這個對象是什麼,因此可讓咱們知道這個對象在哪裏,以及這是何時發生的。

因此Zombies是你的好基友!他可讓你輸出的信息更具體!!

具體這樣作:

圖15

本身再試試輸出Object的信息咯,是否是很棒呢?

殭屍只能用在模擬器和OC語言哦~

相關文章
相關標籤/搜索