Xcode自帶的超好用的診斷工具

歡迎關注咱們的公衆號,咱們每週都會有原創文章分享。咱們主要定位在移動開發領域,分享移動開發技術,包括 iOS、Android、小程序、移動前端、React Native、weex 等。前端

知識小集 GitHubgit

「我靠,這個問題怎麼查,嘗試了幾十遍了,都不能復現?」,「我去,這個問題讓我匪夷所思啊」……常常聽到這類的聲音,因此今天打算給你們簡單介紹幾款 Xcode 自帶的超好用的診斷工具,來提升你們的工做效率。(本文不會介紹詳細的使用方法,請自行谷歌或者百度。)github

善待編譯警告

Xcode 已經爲咱們準備了十分豐富的編譯警告,儘管這些警告不會致使編譯不過,可是背後必定沒有平白無故的恨。請正確對待全部警告,避免在運行時產生一些讓你感到難以捉摸的現象,Treat Warnings as Errors也不失爲一個不錯的選擇。若是你對某些警告有絕對的自信,能夠經過修改 Build Settings 裏的 Warnings 選項,或者在提示警告的代碼處添加 diagnostic ignore 來消除它們。隨着 Xcode 的不斷更新,你還應該經過工程文件的 Editor-Validate Settings 來將工程配置選項改成最優。小程序

不要忽視Analyze

很早之前 Xcode 就已經爲咱們提供了靜態檢測工具,用它能夠檢測一系列難以發現的問題,例如內存泄露、邏輯錯誤、未使用的變量和未包含的庫等。對於不少項目而言,完整的跑一次 Analyze 會花費較長的時間,也許是由於這一點,這項工具被愈來愈多的開發者忽視掉。你能夠經過修改 Build Settings 裏的 Analyze During 'Build' 在平時開發調試的過程當中即時地進行Analyze。weex

運行時診斷

除了編譯警告和 Analyze,蘋果還爲咱們提供了更多的動態調試工具。它們分散在 Xcode 的各個角落,與咱們平常開發息息相關,潤物細無聲。網絡

Debug Gauges

App 開始調試以後,Xcode 左側的 navigator 視圖會自動切換到 debug navigator。在這裏,默認狀況下會展現幾項關鍵指標來爲你概述當前 App 的運行狀態。經過它們你能夠大體瞭解每一個線程的運行、內存申請、電量使用、磁盤讀寫、網絡操做等情況。若是你關心更詳細的診斷信息,你能夠很方便地進入 Instruments 進行相應的診斷。多線程

###Process Debug工具

Xcode 爲咱們提供了四種進程調試:單元測試

  • View Process by Thread:線程的調用棧,這個是默認的,也是咱們最經常使用的。加個斷點,查看當前的全部線程調用狀況。測試

  • View Process by Queue:和 View Process by Thread 差很少,當前隊列名稱會替代 Thread 命名,同時顏色也要豐富一些。

  • View UI Hierarchy:能夠切換到上帝視角來查看視圖層級和各視圖屬性。

  • View Memory Graph Hierarchy:能夠方便的檢測循環引用等內存泄露問題,很是實用。

開啓Diagnostics

除了 Xcode 在早期爲咱們提供的 Guard MallocZombie Objects 等,在最近兩個版本中前後引入的 SanitizersMain Thread Checker 進一步完善了開發過程當中的檢測工具。

  • Address Sanitizer

對於 MRC 環境下的 OC 來說,在一個對象被釋放以後再去對它進行操做會觸發 crash;進入 ARC 時代以後,咱們愈來愈少地去關心這個問題。但當你使用 Core Foundation,或者混編 C\C++ 的時候,這個問題會表現得不可預料。當一片內存區域被釋放以後,在該區域被從新分配以前去訪問它不會出現問題,這就帶來了很大的隨機性。除此以外,若是你在使用指針訪問內存的時候不當心越了界,帶來的後果也是不可預料的。對於這些問題,Xcode 提供了 Address Sanitizer 來更有力地進行檢測。

  • Thread Sanitizer

以往,Data Race 的問題是十分難定位和排查的,由於它帶來的問題每每是不可預期的。Xcode 經過記錄每次內存訪問的時間等信息,在每次訪問內存的時候進行檢測。在平常開發調試過程當中你能夠選擇性地開啓這項工具,可是在單元測試中,應當考慮開啓它,若你的用例覆蓋度較高,它可能能夠爲你發現絕大部分多線程數據競爭的問題。

  • Undefined Behavior Santizer

未定義行文檢測,好比說除以 0,加載內存對其指針、非關聯一個空指針等。有可能引起 crash 也可能不 crash,具體狀況和編譯器有關係,可是咱們應該避免這種事情的發生。

  • Main Thread Checker

檢測在子線程使用 AppKitUIKit 和其餘 API,這個檢測工具是默認開啓的,開啓後不須要從新編譯。原理是經過App啓動後,自動替換隻能在主線程使用的API,當調用此類API時剖出異常。

值得一提的是,因爲 Address SanitizerGuard MallocZombie Objects 的實現原理直接或間接地影響了運行時對象的內存管理,若開啓了這些診斷工具,Debug Gauges 中的 Memory 一項會失效。

總結

儘早的解決警告和診斷 App 會大大提高上線後 App 的穩定性,同時也能夠提升咱們的工做效率,那還等什麼呢,快點行動起來吧。

相關文章
相關標籤/搜索