LLDBのXcodeと高度なデバッグ:パート1

こんにちは、今日は、LLDBを使用したiOSアプリケーションのデバッグに関する記事の翻訳に慣れることをお勧めします。

WWDC 2018プレゼンテーションの最も興味深い部分の1つであるLLDBのXcodeと高度なデバッグは 、Appleのエンジニアによって紹介されました。 開発者が見つけたどこでも、Xcodeおよび低レベルデバッガー(LLDB)でブレークポイントを使用して、バグのデバッグプロセスを最適化する方法について、いくつかの有用なヒントを提供しました。

この記事は3つの部分で構成されており、WWDCで述べられている主なポイントについて説明します。 さまざまなタイプのブレークポイント(ブレークポイント)をLLDBと組み合わせて使用​​して、アプリケーションのバグをキャプチャおよびデバッグする方法を完全に理解するために、デモプロジェクトを作成しました。

デモプロジェクト

すべてのiOS開発者が何らかの方法で出会ったテンプレートタスクプロジェクトを作成しました。 記事を読む前に、その仕組みを理解することが非常に重要です。 デモプロジェクトの主な機能は次のとおりです。


Objective-Cを使用する場合は、ここからデモプロジェクトをダウンロードできます。

Swiftをご希望の場合は、こちらから

Xcodeを起動して、始めましょう!

修正するバグ!

そのため、プロジェクトに精通し、おそらく次のエラーに気付いたでしょう。


重要なルール:この記事の終わりまで、コンパイラーを停止せず、最初の起動後にアプリケーションを再起動しないでください。 プログラムの実行中にエラーを修正します。

指示の力

最初のバグに取りかかりましょう。

1.テーブルがプルダウンされると、投稿は更新されません。

エラーを再現する方法:


このようなエラーを修正するための標準的なアプローチには、テーブルのUIRefreshControlを担当するメソッドセレクター内で何が起こるかを調べることが含まれます。 プラグママークリフレッシュコントロールサポートセクションのPostsTableViewControllerに移動します。 setupRefreshControl関数から、投稿の更新を担当するセレクターはreloadNewPosts関数であると結論付けることができます。 この関数の最初の行にブレークポイントを追加して、ここで正確に何が起こっているのかを調べましょう。 テーブルの先頭までスクロールし、画面をドラッグして更新します。

画像
Objective-c

画像
スイフト

デバッガーは、設定したブレークポイントで停止しました。 さらに学習するには、デバッガの「ブロックをスキップ」ボタンをクリックしてください。

画像
Objective-c

画像
スイフト

これで、何が間違っているのか理解できました!

「if」条件が満たされていない(つまり、ブール変数isPullDownToRefreshEnabledがNOに設定されている)ため、投稿を更新するためのコードはスキップされます。

標準的なアプローチでは、コンパイラを停止する必要があります。次に、isPullDownToRefreshEnabledをYES / trueに設定する必要があり、これにより問題が解決します。 しかし、コードを変更する前に、コンパイラを停止せずに、まず仮説をテストする方がはるかに便利です。 これは、デバッガーの命令コマンドが非常に役立つことが判明した場所です。

インストールされたブレークポイントをダブルクリックするか、「ブレークポイントの編集」を右クリックして「アクションの追加」ボタンをクリックします。 また、アクションタイプ「デバッガーコマンド」を選択します。

画像

ここで、isPullDownToRefreshEnabledプロパティをYES / trueに設定する必要があります。 次のコマンドをデバッガーに追加します。

Objective-c

expression self.isPullDownToRefreshEnabled = YES 


画像

スイフト

 expression self.isPullDownToRefreshEnabled = true 

画像

次に、「アクションの評価後に自動的に続行する」チェックボックスが選択されていることを確認します。 彼は、デバッガー毎回ブレークポイントで停止せず 、新しく追加されたコマンドを自動的に処理し続けることを保証する責任があります。 テーブルの先頭までスクロールし、下にドラッグして更新します。

Voila、新しい投稿が読み込まれ、古い投稿が置き換えられ、それに応じて投稿カウンターが更新されました。

最初の問題を解決し、バグ対策武器を入手して、2番目に進みます。

2.ユーザーは、接続の問題が原因でHTTP要求が完了していないという通知を(アラートコントローラーを使用して)受け取りません。

エラーを再現する方法:


プラグママークネットワークセクションのPostsTableViewControllerに移動します。 loadPosts関数が1つだけあります。 一般的なネットワークマネージャーインスタンスを使用して、「成功」完了ハンドラーを介して投稿の配列を返すGET HTTP要求を実行するか、「失敗」完了ハンドラーを介してNSErrorを返します。

アラートコントローラーを表示するには、「失敗」クロージャーにコードを追加する必要があります。 プラグママークのサポートセクションに移動すると、目的のアラートコントローラーの表示を担当するpresentNetworkFailureAlertController関数が既にあることがわかります。 必要なのは、 loadPostsの 「失敗した」クロージャー内でこの関数を呼び出すことだけです。
従来の方法は、シミュレータを停止し、目的のコードを追加することです。 他の方法で行こう!

「失敗した」クロージャー内の行の後にブレークポイントを追加します

Objective-c

 [self updateUIForNetworkCallEnd]; 

スイフト

 self.updateUIForNetworkCallEnd() 

インストールされたブレークポイントをダブルクリックするか、「ブレークポイントの編集」を右クリックして「アクションの追加」ボタンをクリックします。 また、アクションタイプ「デバッガーコマンド」を選択します。

次のコマンドをデバッガーに追加します。

Objective-c

 expression [self presentNetworkFailureAlertController] 

画像

スイフト

 expression self.presentNetworkFailureAlertController() 

画像

「アクションの評価後に自動的に続行する」チェックボックスが選択されていることを確認します。
インターネットをオフにして、テーブルの先頭までスクロールして下にドラッグして更新するか、テーブルの末尾までスクロールして新しい投稿をロ​​ードしてみてください。 表示される内容は次のとおりです。

画像

今やったことは、特定のブレークポイントでデバッガーに追加されたコマンドを使用しコードを挿入することです。

簡単な要約

ブレークポイントに追加されたデバッガーコマンドを使用してできることをもう一度リストします。


両方のタスクは、プログラムの実行中に行われました。 基本的に、エラーを修正してアプリケーションを再起動するためにコンパイラを停止する必要はありません。

次は?

さらに、 記事の2番目の部分に注目します。ここでは、さらにエラーを修正し、別の種類のブレークポイント(ブレークポイント)-観測ポイント(ウォッチポイント)について学習します。

Source: https://habr.com/ru/post/J431506/


All Articles