[譯] Xcode 和 LLDB 高級調試教程:第 1 部分

在 2018 年的 WWDC 期間,Apple 最優秀的一些調試工程師們開展了一場很是吸引人的會議使用Xcode和LLDB進行高級調試。他們向咱們展現了一些使人印象深入的技巧, 關於每當發生開發人員遇到錯誤並所有修復它們時,如何利用 Xcode 的斷點和低級調試器(LLDB)來優化調試過程。前端

在這個 3 部分的教程中,我將向你介紹 WWDC 會議中已經完成的大部份內容。我建立了一個演示項目專門用於闡述如何配合 LLDB 使用不一樣類型的斷點來修復項目/應用程序中的錯誤。android

演示項目

我寫了一個常見的任務項目,大多數 iOS 開發人員確定在某些時候已經處理過。在繼續閱讀本文以前,須要首先了解它的功能或規則。如下是演示項目的所有內容:ios

  1. 一個表視圖控制器,在第一次打開時加載一個文章列表。
  2. 表視圖控制器支持在到達底部時上拉加載更多文章。
  3. 限制用戶加載文章的次數 **7 次 **。
  4. 用戶能夠經過下拉刷新從新加載新文章。
  5. 導航欄上有兩個標籤,右側標籤用於顯示請求到的文章數,左側標籤則用來顯示用戶已加載文章數。

若是你比較熟悉 Objective-C,能夠在下載這個項目 這裏。 更熟悉 Swift,從這裏下載 這裏。 用 Xcode 打開並運行! 😉git

須要修復的錯誤!

如今你的項目準備就緒了,也許你已經注意到了下面的錯誤:github

  1. 下拉刷新沒有加載新的文章。
  2. 當用戶網絡請求失敗的時候,沒有收到任何提示(例如警報控制器)。
  3. 用戶能夠下拉刷新 超過 7 次。
  4. 導航欄左側指示用戶加載次數的標籤也沒有更新。

指導原則:在本文剩下的部分,你沒必要中止編譯器或者從新運行應用,你能夠在運行時修復這些錯誤。express

表達式的力量

讓咱們來解決第一個錯誤。後端

  1. 下拉刷新沒有加載新的文章。

這裏有復現這個錯誤的步驟:數組

✦ 運行應用程序 → 前十個文章被加載。xcode

✦ 向下滾動加載更多文章。markdown

✦ 滾動到表視圖頂部,而後下拉刷新。

✦ 新文章 沒有 從新加載,舊文章仍讓存在而且文章計數沒有重置。

修復此錯誤的常規方法是調查分配給表視圖控制器的專用 UIRefreshControl 的選擇器方法內部發生了什麼。前往 **PostsTableViewController** 找到有 pragma mark Refresh control support 的部分。咱們能從setupRefreshControl 方法推斷出決定刷新的是 reloadNewPosts 方法。讓咱們給這個方法的第一行加一個斷點,看看這裏到底發生了什麼。如今滾動到表視圖的頂部,下拉刷新。

Objective-C

Swift

一旦你釋放了下拉刷新控件,調試器就會在你設置斷點的地方暫停。如今,爲了探究背後發生了什麼,點擊調試器的跨過按鈕。

Objective-C

Swift

如今咱們就很清楚的知道發生了什麼!

由於 if 條件沒有知足(例如isPullDownToRefreshEnabled 布爾值類型的屬性被設置爲 NO)所以,相應的用於加載文章的代碼就沒有被執行。

修復這個錯誤的常規作法是中止編譯器,設置 isPullDownToRefreshEnabled 屬性爲 YES/true。可是在真正的修改代碼和中止編譯器以前,就能夠對這些假設作出驗證會更方便。這裏有表達式語句的斷點調試器的命令動做,很是方便。

雙擊設置的斷點,或右鍵單擊,編輯斷點並點擊「添加動做」按鈕。選擇「調試器命令」動做。

如今咱們要作的是設置 isPullDownToRefreshEnabled 屬性爲 YES/true。添加以下的調試器命令。

Objective-C

expression self.isPullDownToRefreshEnabled = YES
複製代碼

Swift

expression self.isPullDownToRefreshEnabled = true
複製代碼

接下來你要作的是檢查「評估動做後自動繼續」框。這會使得調試器不會在每次觸發它的斷點時暫停,並在評估你剛纔添加的表達式後自動繼續。

如今滑動到頂部,下拉刷新。

新的文章被取回來了,而且替換了舊的,所以文章的技術也獲得了更新。

既然你已經解決了第一個錯誤,拿起你的除蟲武器開始處理第二個吧。

  1. 當用戶的 HTTP 請求失敗的時候,沒有收到任何提示(例如警報控制器)。

這裏有復現這個錯誤的步驟:

✦ 關閉手機或模擬器的網絡鏈接。

✦ 滑動到表視圖的頂部,下拉刷新。

✦ 因爲網絡錯誤,沒有加載到新文章。

✦ 網絡鏈接錯誤的警報控制器沒有展現給用戶。

前往 PostsTableViewController 找到 pragma mark Networking的部分。它只有一個方法 loadPosts。它利用網絡管理器的單例去執行一個 GET HTTP 請求,它會返回一個包含文章對象的數組,經過一個「成功」完成的回調或者一個 NSError 的實例,經過一個「失敗」完成的回調。

咱們想要作的是在失敗完成處理回調中添加一些代碼以展現一個網絡錯誤警報控制器。 若是你找到到帶有 pragma mark 「Support」 的部分,你將會發現已經有一個已實現的方法 presentNetworkFailureAlertController 處理了所需警報控制器的顯示。咱們須要作的就是在 loadPosts 失敗完成回調中調用該方法。

常規的作法是中止編譯器,添加所需的代碼,而後就好了。讓咱們超脫出來!

這一行代碼下,添加一個斷點

Objective-C

[self updateUIForNetworkCallEnd];
複製代碼

Swift

self.updateUIForNetworkCallEnd()
複製代碼

雙擊設置的斷點,點擊「添加動做」按鈕。選擇調試器命令動做。添加下面的調試器命令。

Objective-C

expression [self presentNetworkFailureAlertController]
複製代碼

Swift

expression self.presentNetworkFailureAlertController()
複製代碼

勾選「評估動做後自動繼續」。

停用網絡鏈接後,滾動到表視圖頂部並下拉刷新,或者你能夠向下滾動到表視圖底部嘗試加載更多。你會獲得這個 🎉🎉

你剛纔作的是**「注入」**一行代碼,經過一個在專用斷點內實現爲調試器命令動做的表達式語句。

歸納

讓我簡單歸納一下咱們用斷點調試器命令動做表達式語句作的事情:

  1. 控制存在的屬性的值。
  2. 注入新的代碼。

這兩項任務都是在運行時實現的,咱們不須要真的中止編譯器,修改內容而後從新運行應用程序。

接下來去哪裏?

查看 第二部分 本教程中修復了額外的錯誤,並學習一種特殊類型的斷點,觀察點。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索