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

こんにちは、今日はLLDBでのアプリケーションのデバッグに関する記事の第2部に注目します。



最初の部分では、Xcodeでブレークポイントを使用して変数の既存のプロパティを変更し、命令コマンドを使用してコード行を追加する方法を見つけました。



LLDBでさまざまな種類のブレークポイントを使用してアプリケーションをデバッグする方法を理解するために、いくつかのエラーを含む意図的なデモプロジェクトを作成しました。



記事の最初の部分を学習していない場合は、最初の部分から始める方が良いでしょう。 このチュートリアルの重要なルールを思い出させてください。この記事の最後まで、コンパイラーを停止せず、最初の起動後にアプリケーションを再起動しません。 プログラムの実行中にエラーを修正します。



ウォッチポイント



そのため、アプリケーションの次のエラー:



3.投稿を7回以上読み込むことができます。



エラーを再現する方法:





エラーを検出するためのオプションの1つとして、新しい投稿がページに読み込まれた後に整数変数pageNumberがどのように更新されるかを調べる必要があります。 あなたはまだ私のコードに精通していないので、あなたはそれで何が起こっているかを理解するためにいくらかの時間を費やす必要があります。



心配しないで。 魔法をかけます。



記事の最初の部分から、GET HTTPリクエストがプラグママークネットワークセクションで実行されることを学びました。 loadPosts関数が1つだけ含まれています。 この関数の最初の行にブレークポイントを配置し、テーブルを下にドラッグして更新します。 コンパイラはこのブレークポイントで停止します。



画像

Objective-c



画像

スイフト



デバッガーの下部のウィンドウで、「変数の表示」ボタンをクリックします。 左側に新しいウィンドウがポップアップし、そこにすべての変数PostsTableViewControllerが表示されます。



画像



pageNumberにカーソルを合わせ、右クリックして、Objective-CとSwiftでそれぞれ「Watch _pageNumber」/「Watch pageNumber」を選択します。



画像

Objective-c



画像

スイフト



したがって、pageNumber変数のいわゆるウォッチポイントを作成しました。 ウォッチポイントは、変数の値が変更されるたびにデバッガーを停止するブレークポイントの一種です。



画像

Objective-c



画像

スイフト



プログラムを続行します。 デバッガーが停止し、次のようなものが表示されます。



Objective-c



画像



  1. pageNumber変数の古い値と新しい値を記録します。
  2. pageNumber変数の値を変更するコードのスタックを追跡します。
  3. pageNumber変数を変更させた現在のポイントは、この変数の設定メソッドです。


スタックトラッキングのステップ1を参照すると、次のコードスニペットが表示されます。



画像



スイフト



画像



  1. デバッガは、設定した観測ポイントが何かを明らかにしたことを通知します。
  2. pageNumber変数の値を変更するコードのスタックを追跡します。
  3. pageNumber変数を変更させた現在のポイントは、 updateForNetworkCallEnd関数です。


HTTP GETリクエストが成功した後は、(enum型の) 状態変数が「アクティブ」状態になるまで、 pageNumber変数が毎回 1ずつ増加すると結論付けるのが論理的です。 この変数には、アクティブ(「アクティブ」)または非アクティブ(「非アクティブ」)の2つの状態があります。 「アクティブ」状態は、ユーザーが投稿をロードできることを前提としています(つまり、7回のダウンロードの制限に達していない)。 反対に、「非アクティブ」状態は、ユーザーが投稿をロードできなくなることを前提としています。 そのため、 updateForNetworkCallEnd関数にロジックを追加する必要があります。この関数は、 pageNumber変数をチェックし、 状態変数を適切な状態に設定します。



ご想像のとおり、コードを変更する前にコンパイラーを停止せずに仮説をテストする方がはるかに簡単です。



プラグママークの[サポート]セクションには、 状態変数を「非アクティブ」に設定する必要な関数( setToInactiveState )が既にあることに注意してください。

if条件の1行上にブレークポイントを追加します。 また、次の命令コマンドをデバッガーに追加します。



Objective-c



expression if (self.pageNumber >= 7) {[self setToInactiveState]}
      
      





画像



スイフト



 expression if (self.pageNumber >= 7) {setToInactiveState()}
      
      







画像



その後、観測ポイントの設定に使用した最初のブレークポイントを削除します。 ウォッチポイント自体も非アクティブ化します。



画像

Objective-c



画像

Objective-c



画像

スイフト



画像

スイフト



テーブルを上にスクロールし、下にドラッグして更新し、フリップを開始します。

すべてがうまくいきました! しかし、祝うには時期尚早で、まだ修正すべきバグが1つあります!



次は?



記事の最後の3番目のパートでは、別の種類のブレークポイント-シンボリック(シンボリックブレークポイント)について学習します。



All Articles