xcode調試

1.Enable NSZombie Objects(開啓殭屍對象)html

Enable NSZombie Objects多是整個Xcode開發環境中最有用的調試技巧。這個技巧很是很是容易追蹤到重複釋放的問題。該技巧會以很是簡潔的方式打印指出重複釋放的類和該類的內存地址。ios

 

怎麼開啓殭屍對象呢?首先打開「Edit Scheme」(或者經過熱鍵?<),而後選擇Diagnostics選項卡,勾選Enable NSZombie Objects選項。xcode

如今咱們能夠關掉ARC來測試重複釋放的問題、異常和更容易產生的Crashs,可是即便開啓ARC,重複釋放和與內存相關的Crashs也常常發生。如今假設咱們犯了一些錯誤致使了重複釋放的發生來觀察將要發生什麼。網絡

 
  1. UIView* view = [[[UIView alloc] init] autorelease];   
  2. //...   
  3. //do something with view...clearly forgetting that it has been autoreleased.   
  4. //   
  5. [view release];   

 

如今運行這段代碼會發生重複釋放的問題,程序將崩潰在主函數,會像下面這樣:app

Enable NSZombie Objects會讓調試器看起來像這樣:框架

這個例子看起來做用很是小,可是對於一個大工程經過Enable NSZombie Objects打印的信息是很是有用的。iphone

 

二、重寫object的respondsToSelector方法

 

在iphone開發的時候EXC_BAD_ACCESS這個bug時不容易找到緣由的。編輯器


首先說一下EXC_BAD_ACCESS 這個錯誤,能夠這麼說,90%的錯誤來源在於對一個已經釋放的對象進行release操做,或者操做一個在循環代碼中被修改的序列中的對象。雖然使用NSZombieEnabled變量能夠幫助你找到問題所在,但有的時候,即便經過設置NSZombieEnabled變量,仍是不能定位到問題所在,這個時候,你能夠試試重寫object的respondsToSelector方法,顯示出現EXEC_BAD_ACCESS前訪問的最後一個object,下面是具體的步驟:ide

a、在每一個類而且在 other c flags中加入-D _FOR_DEBUG_(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,Xcode的console上就會準確地記錄了最後運行的object的方法。的實現文件(.m,.mm)文件中,添加以下代碼:函數

 

  1. -(BOOL) respondsToSelector : (SEL)aSelector {  
  2.     printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  
  3.     return [super respondsToSelector:aSelector];  
  4. }  

 

2.對於全部異常添加Global BreakPoint(全局斷點)

當你的應用異常或者崩潰的時候Xcode喜歡作的一件事情是直接跳到主函數,就像第一個調試技巧中用到的那個例子同樣。若是異常或者崩潰可以停 留在異常或者崩潰發生的地方那該是多好呀。幸運的是有一個方法能夠作到。Xcode有一個漂亮的功能叫作異常斷點,容許咱們在異常發生的時候在異常發生的 地方放一個斷點。你能夠指定具體的異常也能夠指定全部的異常。

 

怎樣開啓異常斷點呢?工程切換到異常瀏覽窗口,點擊下方左側的「Add Breakpoint」按鈕,而後選擇「Add Exception Breakpoint」確保能夠捕獲全部異常。

如今異常發生時調試器不會直接跳轉到主函數了,而是停留在了異常發生的地方。

這個斷點給了咱們一個調試異常很是好的開始的點,不用咱們再去遍歷代買去找異常發生的地方了。

 

3.Static Analyzer(靜態分析)

Static Analyzer是一個很是好的工具去發現編譯器警告不會提示的問題和一些我的的內錯泄露和死存儲(不會用到的賦了值的變量)錯誤。這個方法可能大大的提升內存使用和性能,以及提高應用的總體穩定性和代碼質量。

 

怎麼打開Static Analyzer?打開Xcide的「Product」菜單,選擇Analyzer選項(或者使用熱鍵? shift B)。正像你看到的下面的截圖,Static Analyzer會捕獲任何應用內的可能的問題而後以藍色的警告展現出來。

咱們也能夠設置咱們的應用在咱們編譯應用的時候自動開啓Static Analyzer,打開項目project文件,設置「Run Static Analyzer」爲YES,以下圖:

4.Condational Breakpoints(條件斷點)

最後一個調試技巧條件斷點,這只是普通的斷點,當變量知足必定條件時程序中止。這個調試技巧在當你想要捕獲一個循環中的變量的特定值或者一些不常發生的狀況時是很是有用的,而不用你每次迭代都中止來查看。

 

怎樣開啓條件變量?只不過是添加一個普通斷點,而後右鍵點擊斷點選擇「Edit Breakpoint」,這時就打開了一個斷點編輯器,你能夠在這裏設置斷點條件(以及一些其餘的斷點設置),而後選擇「Done」,這個調試技巧很是簡單吧。

5.unrecognized selector send to instancd 快速定位

在Debug菜單中Breakpoints->Create Symbolic Breakpoint

在Symbolic中填寫以下方法簽名

 
  1. -[NSObject(NSObject) doesNotRecognizeSelector:]   

 

設置完成後再遇到相似的錯誤就會定位到具體的代碼。

 

 

當您點擊了工做區工具條中的運行按鈕而且你的應用編譯成功,那麼Xcode運行您的應用程序並開啓調試功能。您可使用圖形化的工具直接在源碼編輯器中調試應用,好比使用Data tips、快速查看(Quick look)來查看變量值。

調試區域(Debug area)和調試導航器(Debug navigator)可讓您檢查運行中的app的狀態,並控制其執行。

065.jpg

爲了建立一個高質量的應用,要儘量減小應用對用戶系統的影響。使用調試導航器(Debug navigator)中的調試儀表(Debug gauges)深刻了解你應用的資源消耗,當你發現問題時,請使用Instruments確認並分析應用的性能。

若是你正在開發一款iOS應用,在設計和早期測試階段可使用iOS模擬器找出存在的問題。

你 能夠配置Xcode來幫助你專一於調試任務。舉例來講,當代碼運行到一個斷點時,你可讓Xcode自動播放一次警告聲,並建立一個命名爲的Debug標 籤的窗口,Xcode可在此展現調試區(Debug area)、調試導航器(Debug navigator)以及斷點處的代碼。

控制執行並觀察狀態信息(Control Execution and View State Information)

Xcode 容許您一行一行單步調試你的代碼來查看特定執行階段中應用的狀態。使用調試區域(Debug area)來控制代碼的執行,觀察程序的變量和寄存器,觀察控制檯的輸出而且與調試器交互。 你也可使用調試區導航渲染幀的OpenGL調用,並查看特定調用的渲染狀態信息。

經過點擊工做區窗口工具條上視圖選擇器的中間按鈕(59.png)來展現調試區域(Debug area)。

 60.png

點擊調試區工具欄中的暫停按鈕(在暫停60.png和繼續601.png之間切換)來暫停app的執行。想要設置斷點,只須要打開源代碼文件,而且點擊你想暫停執行代碼所在行的邊列(Gutter)。邊列中一個藍色箭頭(63.png)會標識斷點。若是想了解更多關於斷點的信息,包括如何設置斷點行爲和不一樣類型的斷點,請查看Breakpoint Navigator Help.

暫停應用後,當前正在執行的代碼行會用綠色高亮。你可使用調試區頂部條上的Step Over(01.png)、Step Into(02.png)、Step Out(03.png)三個按鈕來單步調試代碼的執行。Step Over會執行當前行的代碼行,包括任何的方法。若是當前的代碼行調用了一個方法,step into會開始執行當前代碼行,而後在到達被調用方法的第一行時中止。Step Out則執行當前方法或函數的剩餘部分。

當暫停執行時,調試導航器會打開並展現一個堆棧追蹤。選中其中一項,在編輯區和調試區中查看該項目的信息。當你調試時,可展開或收起線程來顯示或隱藏堆棧框架。

 61.jpg

將指針懸停在源代碼編輯器中的任何變量上,可查看一個顯示着變量值的數據提示。點擊變量旁邊的Inspector圖標(QuickLookInspectorIcon_2x.png),將對象的Objective-C描述打印至調試區控制檯,並在一個額外彈出視圖中展現。

62.png

點擊Quick Look圖標(QuickLookVarIcon_2x.png)觀察變量內容的圖形化展現。你能夠針對本身的對象實現自定義的快Quick Look。詳細信息請查看Quick Look for Custom Types in the Xcode Debugger.

DataTipQuickLook_2x.png

當你在設備上構建並運行一個OpenGl ES應用時,調試區工具欄會包含一個Frame Capture 按鈕( )。點擊該按鈕來捕捉一個frame。你可使用OpenGL ES幀捕獲作如下事情:

· 檢查OpenGL ES 狀態信息

· 內省OpenGL ES 對象,好比視圖紋理和着色器。

· 在每次繪製調用以前單步調試狀態調用,而後觀察每一個調用的變化。

· 單步調試繪製調用以準確查看如何構建圖像。

· 在輔助編輯器中查看每一個繪製調用使用哪些對象。

· 編輯着色器以查看應用程序上的效果。

如下截圖展現已渲染幀的組件。左側調試導航器顯示部分渲染樹,主調試器顯示已渲染幀的顏色和深度資源,並展現其餘一些圖片資源。

64.jpg

想要了解更多關於調試OpenGL ES的信息,請查看Debug Navigator Help 和 Debug Area Help.

在運行時檢查你應用的視圖層次(Examine Your App’s View Hierarchy at Runtime)

點擊在調試區頂欄的Debug View Hierarchy按鈕(IB_Debug_ViewDebug_2x.png)來檢查當前暫停應用的3D渲染視圖分層。你能夠:

· 經過在畫布中點擊並拖動來旋轉該透視圖。

· 使用左下方的滑動條增大或減少各視圖層之間的間距。

· 使用右下方雙滑塊的滑動條改變可見視圖的範圍。滑動左滑塊來改變最底層可見的視圖,滑動右滑塊來改變最上層可見的視圖

· 按下展現剪切內容按鈕(IB_ViewDebug_ShowClipped_2x.png)來顯示選中視圖中被裁減的內容。

· 按下展現約束按鈕(IB_ViewDebug_ShowConstraints_2x.png)來顯示選中視圖的任何Auto Layout約束。

· 使用放大(+)按鈕和縮小(—)按鈕來增長或減小透視圖的放大倍數。

 65.png

想要了解更多調試視圖的信息,請查看Debugging Views

檢查應用對系統資源的影響(Examine Your App’s Impact on System Resources)

調 試導航器(Debug navigator)提供了能對應用程序性能進行深度分析的儀表。好比CPU儀表計量器展示了app的CPU的使用率,方便你偵測異常狀況。根據應用的目 的和功能,儀表計量器能夠告訴你應用對內存、iCloud、OpenGL ES、電量以及CPU的影響。

 DebugGauges_2x.png

若是想要看詳細的報告,可單擊調試區的某個儀表計量器。若是你想要對你應用作更深層次的分析,請點擊Profile In Instruments按鈕。

 66.jpg

在問題區,電量報告會提供一個初步的診斷來告知你什麼可能在嚴重損耗你的用電量。

 67.jpg

想要更多幫助,請查看Using Debug Gauges

測量應用程序的性能(Measure Your App’s Performance)

Xcode 中的Instruments程序會從在運行的應用中收集數據,而且展示在一個圖形化的時間線上。使用Instruments,你能夠收集性能方面的數據, 好比你應用的內存使用,磁盤活動狀況,網絡活動狀況和圖形操做。經過把數據放在一塊兒查看,你能夠分析你應用表現的各個方面來找出潛在提高性能的可能。你也 能夠自動化測試iOS應用的界面元素。

 68.jpg

在Xcode幾種方法來打開Instruments,好比:

· 從儀表計量器詳細報告界面點擊Profile in Instruments 按鈕

· 選擇Product>Profile

· 在一個scheme中的Profile項中指定一個Instrument

Instruments程序使用名爲instruments的單獨的數據採集模塊,來隨時收集某個進程的數據。Instruments程序有一個模板庫,每一個模板包括了爲獲取相關信息的一系列instruments。

想要了解更多信息,請查看Performance OverviewInstruments User Guide

在iOS模擬器上進行早期測試(Perform Early Testing in iOS Simulator)

iOS模擬器可幫你在設計和早期測試階段找到主要的問題。舉例來講,iOS模擬器的Debug菜單提供的多款工具可爲你提供幫助:

· 減速一個動畫來找出問題。

· 觸發iCloud同步。

· 辨認出那些可能會有損你應用性能的混合視圖層。

· 辨別出源像素沒有對準到目標像素的圖片

· 查看哪些內容在屏幕外渲染渲染。

· 模擬不一樣的地點。

 69.png

在 iOS模擬器的任何模擬環境下,主屏幕都會提供打開iOS原生應用(好比Safari,Contacts,Maps和Passbook)的功能。你能夠在 iOS模擬器中初步的測試你的應用與這些應用的交互。舉例來講,若是你正在測試一款遊戲,可使用iOS模擬器來測試這款遊戲是否正確調用Game Center。

iOS模擬器中的輔助功能檢視器(Accessibility Inspector)可幫助你不受我的制約的測試你應用的可用性。Accessibility Inspector顯示你應用可訪問的每一個元素的信息而且能夠模擬VoiceOver與這些元素交互。若是想打開Accessibility Inspector,點擊iOS模擬器的主屏按鈕而後點擊設置>通用>輔助功能。將Accessibility Inspector右側滑動按鈕打開。

你能夠在iOS模擬器經過改變語言來測試你應用的本地化。設置>通用>語言與地區>iPhone語言。

儘管你能夠在iOS模擬器中測試你應用的基本功能,可是做爲一個測試平臺,因爲諸多緣由,模擬器還有不少限制。好比:

· 由於iOS模擬器是在Mac上運行,並使用電腦的內存,這遠大於真機上的內存。

· iOS模擬器使用Mac的CPU運行而不是iOS真機的CPU。

· iOS模擬器並不運行真機上的全部線程。

· iOS模擬器沒法模擬像加速度計,陀螺儀,攝像頭,或者近距離傳感器之類的硬件特性。

開發應用時,請務必在你想要支持的全部iOS真機和iOS系統版本上運行和測試。

想要了解更多詳細信息,請查看iOS Simulator User Guide中的Testing and Debugging in iOS Simulator一節。

自定義你的調試工做流(Customize Your Debugging Workflow)

經過Xcode Behaviors來偏好定製Xcode的行爲。選擇Xcode> Behaviors,自定義在創建、運行和調試應用時Xcode該作的事。

好比,Xcode能夠在你代碼在斷點暫停時顯示調試區域或者在創建應用失敗時,顯示問題導航器

下面截圖中展現了當代碼暫停時,Xcode行爲是怎麼自定義的下面有些自定義行爲的例子。

· 每次暫停時播放一個提示音。

· 在工做區域窗體中建立一個名爲Debug的標籤來展現調試導航器。

· 在Debug標籤中同時展現變量視圖和控制檯視圖。

· 在Debug標籤中隱藏Utilities區域。

 70.jpg

當你設置了上面的行爲後,當項目中的代碼碰到斷點時,Xcode在工做區窗口建立一個debug標籤,裏面顯示特定的內容。

 71.jpg

你 能夠自定義Xcode的行爲,這些自定義行爲能夠由菜單中的選項或者綁定的快捷鍵觸發。選擇Xcode > Preferences, 選擇Behaviors偏好窗口,而後點擊底部的Add(+)按鈕。輸入新行爲的自定義名稱而後按下Return。在右側複選框中勾選當你觸發這個行爲時 你想讓Xcode作的事。好比,創建一個名爲Unit Testing的行爲用來保存你工程的快照而且運行你的單元測試。當你創建這個行爲後,它會出如今Xcode> Behaviors菜單中。

想給自定義行爲添加個快捷鍵的話,選擇Xcode > Preferences而後點擊Key Bindings。在Key Bindings偏好窗口中,選擇Customized標籤找到你自定義的行爲。在文本框中,鍵入快捷鍵而後點擊文本框之外的地方完成操做。

想要了解更多斷點的類型和斷點的做用,查看Breakpoint Navigator Help

相關文章
相關標籤/搜索