[譯] Xcode 中的使用者斷點

O_3發表於2019-02-26

Xcode 中的使用者斷點

大家應該都用過 Xcode 中的斷點,但你們熟悉使用者斷點麼?下面我將向你們介紹如何使用以及何時使用這種斷點。如果你已經對使用者斷點有所瞭解了,可以檢視下文章後面的清單,看看我們是如何在 PSPDFKit 中使用它們的,也許有一些新的東西可以新增到你的清單中!

常規斷點

當建立一個常規斷點時,它們會出現在 Xcode 的斷點導航器中,分列在工作區或者工程下,這取決於你當前所工作的位置。你可以通過點選列表中或者它所指向的程式碼旁邊的的斷點符號來啟用或禁用一個斷點。

A regular breakpoint
A regular breakpoint

這些斷點儲存在特定工作區或工程的個人設定中,僅自己可見。即使你將個人設定提交到專案中,在同一個專案中的同事也不會在他們的 Xcode 中看到你的斷點。

分享斷點

通過右擊斷點,選擇 `Share Breakpoint`,這個斷點會對專案中的所有人可見。如果專案中有你希望每次都能停止執行的程式碼路徑,例如自定義的異常處理或其他任何不應在正常情況下執行的特定的專案程式碼,這是很有用的。結合斷點選項和可自動執行的斷點,這對於提高除錯體驗也很有幫助。

另一個你可以用它來做的稍微不那麼有用的事:在應用程式的執行程式碼路徑中新增一個共享的斷點,比如完成一個網路請求,讓它自動地連續執行,並讓它在每次被擊中時播放一個聲音 – 是的,你可以讓你的斷點發出聲音。提交斷點,然後看著試圖弄清楚聲音是從哪裡來而抓狂的同事!? 不過,在遠端工作的環境下,惡搞你的同事是很難的,這就是我為什麼沒有在 PSPDFKit 這麼做。。。但可以在我們的線下團建時拿來娛樂一下。

使用者斷點

你還可以用斷點來做另一件事。它是一個很強大的特性,只不過在 Xcode 中有點難找。你可以通過右擊斷點選擇 `Move Breakpoint To > User`,使其變成使用者斷點。

A regular breakpoint
A regular breakpoint

這會將斷點從工作區或專案範圍轉移到一個使用者範圍內。這意味著斷點會出現在你的機器上的所有專案中。雖然這對與特定專案相關的事情不是很有幫助,但還是有很多的斷點可以被新增到使用者範圍的列表中。最明顯的事情是 Objective-C 的異常和 Swift 的錯誤斷點,可能每個人都會在每個專案中都新增一次相應的斷點。使用使用者斷點的話,你只需新增它們一次,它們就會自動出現在您的所有專案中。

另一個我使用的使用者斷點是在應用程式啟動時啟用 Reveal。Reveal 是一個很好的用來除錯檢視相關問題的工具,我經常使用它。它需要通過一個服務來整合到你的應用中,並且服務需要自己啟動,這可以通過偵錯程式來實現,而不必新增相應的除錯程式碼。當你把這個斷點移動到使用者空間下後,你就不再需要將它新增到每個專案中去。如果你的專案包含了 Reveal 的服務, 當應用程式啟動時服務會自動啟動。這個方法也在 Reveal 的 接入指南 提到過。

還有一些其他的斷點在每個專案中都很有幫助。請記住,你可以停用它們,只在需要的時候開啟它們;我的很多斷點都是預設關閉的,但如果我需要它們,它們就在那裡。這是我們團隊在 PSPDFKit 中最喜歡使用的斷點清單:

  • Symbol:UIViewAlertForUnsatisfiableConstraints

    當出現自動佈局約束的問題時自動停止。這會比僅僅在Xcode的控制檯輸出一條列印資訊更讓你注意這個問題。它有助於我們及早地發現佈局問題。

  • Symbol:NSKVODeallocateBreak

    在 KVO 抱怨觀察者仍在原地的地方中斷。

  • Symbol:UIApplicationMain
    Debugger command:e @import UIKit

    將 UIKit 匯入到偵錯程式中,不再需要在很多地方轉換型別。你寫過很多類似 p (CGRect)[self bounds] 的語句麼?這消除了將其轉換為 CGRect 的需求。

  • Symbol:-[UIViewController initWithNibName:bundle:]
    Debugger command:po $arg1

    在檢視控制器初始化期間列印其型別。當在大型專案中工作或者你是個新來的,你會不知道所有試圖控制器的名字。如果你想知道你要修改的檢視控制器的名字的話,你只需啟用這個斷點,然後在應用中導航到這個檢視控制器,你會在偵錯程式中看到所列印的名字。

  • Symbol:-[UIApplication sendAction:toTarget:fromSender:forEvent:]

    當有事件發出時中斷,例如按鈕的觸控。這和上面那個很相似。啟用這個斷點,如果你不知道按鈕被觸控時呼叫了哪個方法的話。p (SEL)$arg3 會列印出呼叫的選擇器,po $arg4 會列印呼叫它的目標。

  • Exception Breakpoint: Objective-C
    Debugger command:po $arg1

    當 Objective-C 斷點被觸發時中斷,並列印相應的異常資訊。

  • Exception Breakpoint: C++

    當 C++ 異常丟擲時中斷。

  • Swift Error Breakpoint

    在 Swift 錯誤出現時中斷。

  • Symbol:_XCTFailureHandler

    當單元測試產生錯誤時中斷。如果你正在執行單元測試,並想要當錯誤出現時中斷程式,這就是。

如果你的清單中有其他的你覺得有用的斷點,請聯絡我。如果你想了解更多關於 Xcode 斷點所能做的事情以及如何用指令碼化的斷點除錯特定的例項的話,可以瀏覽我們的部落格!


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOSReact前端後端產品設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃

相關文章