AppCode 2023.1 ヘルプ

AppCode でデバッグする

このチュートリアルでは、AppCode デバッガーの基本機能と高度な機能の両方について説明します。さまざまな種類のブレークポイントを使用してプログラムの実行を停止する方法、一時停止したプログラムの状態を調べる方法、コードをステップ実行する方法、デバッガーセッションを終了せずにプログラムの動作を変更する方法などを学習します。

ビデオチュートリアルを見て、以下のステップバイステップの手順に従ってください。

例として、ローカル JSON ファイルから会議のリストをロードする単純な SwiftUI アプリケーションを取り上げます。SwiftUI アプリケーションを作成するチュートリアルでどのように開発されたかを見ることができます。

現時点では、このアプリケーションには、AppCode デバッガーを使用して見つけて修正するバグがいくつか含まれています。プロジェクトをダウンロード(英語)し、Shift+F10 を押すか、メインツールバーの the Run button ボタンをクリックして実行します。

例外ブレークポイントを設定し、実行時にコードを挿入する

問題

最初の起動時に、アプリケーションは実行ツールウィンドウのコンソールで次のエラーでクラッシュします。

Fatal error: Cannot parse conferencesData.json: Array<Conference>: typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "start", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil)): file /path/to/the/project/ac_tutorial_debugging/iOSConferences/Model/Data.swift, line 27

ソリューション

このエラーをスローするコードを見つけるために、例外ブレークポイントを設定しましょう。

例外ブレークポイントを設定する

  1. メインメニューから実行 | ブレークポイントの表示を選択するか Ctrl+Shift+F8 を押します。

  2. 開いたブレークポイントダイアログで、左側の例外のブレークポイントチェックボックスを選択します。これにより、例外がスローされた場合にヒットするデフォルトの例外ブレークポイントが有効になります。

    Exception breakpoint
  3. 終了をクリックして変更を適用し、Shift+F9 を押すか、ツールバーの the Debug button をクリックしてデバッグセッションを開始します。

プログラムの実行はエラーをスローした行で停止し、デバッグツールウィンドウが表示されます。

The Debug tool window

スレッドと変数タブには、左側にメソッド / 関数呼び出しのスタックが表示され、右側に現在のコンテキストで使用可能な変数のリストが表示されます。

発生したエラー(Double をデコードする予定ですが、代わりに文字列 / データが見つかりました)は、decoder 変数に格納されている JSONDecoder オブジェクトに関連している可能性があります。この変数を展開すると、JSONDecoder オブジェクトのすべてのプロパティを確認できます。値が切り捨てられている場合は、表示をクリックしてポップアップで開きます。

the Variables tab

JSONDecoder は、倍精度形式でのみ日付を処理できる deferredToDate デコード戦略を使用しているのに対し、JSON には文字列の日付値があることがわかります。

実行時に新しいコードを挿入する代わりに、formatted デコード戦略を使用してみましょう。

実行時にコードを挿入する

  1. decode() メソッドが呼び出される直前、つまり次の行にブレークポイントを設定します。

    return try decoder.decode(T.self, from: data)
  2. Ctrl+Shift+F8 を押してブレークポイントダイアログを開きます。

  3. ブレークポイントダイアログで、25 行目の行ブレークポイントを選択し、評価して記録オプションをチェックします。

    the Breakpoints dialog

    このフィールドには、ブレークポイントに到達したときに実行するコードを入力できます。the Expand button をクリックしてテキストフィールドを展開し、次のコードを入力します。

    let formatter = DateFormatter() formatter.dateFormat = "yyyy-mm-dd" decoder.dateDecodingStrategy = .formatted(formatter)

    現在のコンテキストで表示されるシンボルの場合、自動補完を使用できます。

    the Evaluate and Log field
  4. 終了をクリックし、Ctrl+F5 を押すか、デバッグツールウィンドウの Rerun Program ボタンをクリックして、プログラムをデバッグモードで再実行します。

これで、アプリケーションが一時停止されると、decoder.dateDecodingStrategy プロパティに新しい値があり、スレッドと変数タブに正しく表示できないことがわかります。

The variable value not displayed

LLDB コンソールを使用して、そのような値を確認できます。LLDB タブに移動し、次のコマンドを入力します。

po decoder.dateDecodingStrategy

デコーダーは、formatted 日付デコード戦略を使用しています。

The LLDB console

F8 を押して次のコード行にステップオーバーし、スレッドと変数タブに戻ります。conferencesData 変数は、解析された JSON ファイルの値を格納するようになりました。

The parsed data

F9 を押してプログラムを再開し、会議のリストがデバイスまたはシミュレーターに表示されていることを確認します。

The first bug fixed

ブレークポイントヒット時に挿入されたコードでバグが修正されたため、エディターで追加できます。

do { let decoder = JSONDecoder() let formatter = DateFormatter() //line to add formatter.dateFormat = "yyyy-mm-dd" //line to add decoder.dateDecodingStrategy = .formatted(formatter) //line to add return try decoder.decode(T.self, from: data) } catch { fatalError("Cannot parse \(filename): \(T.self):\n\(error)") }

アイコンをクリックして、25 行目のブレークポイントを削除します。

変数値を設定

問題

アプリケーション Shift+F10 を再実行し、ドット Swift 会議を選択します。アプリケーションは次のエラーでクラッシュします:

Fatal error: Unexpectedly found nil while unwrapping an Optional value: file /path/to/the/project/iOSConferences/Model/Conference.swift, line 17

ソリューション

実行時に新しい変数値を設定して、このバグを修正しましょう。

  1. エラーメッセージで指定されたファイルと行に移動し(Ctrl+Shift+N を押して <filename>:<line number> と入力)、textDates() メソッドの最初の行に行ブレークポイント Ctrl+F8 を設定し、Shift+F9 を押します。

  2. デバイスまたはシミュレータの画面で、ドット Swift 会議を選択してバグを再現します。変数タブとエディターで、選択した会議の終了日が nil と等しいことがわかります。

    The end date is nil

    17 行目を実行した後、より正確には、オプションの値をアンラップしようとすると、アプリケーションがクラッシュすることがわかります。

    end!.dateToString()
  3. end 変数に nil 以外の値を設定して、それがバグの原因であることを確認してみましょう。変数タブで end 変数を選択し、F2 を押します。表示されるテキストフィールドに「Date()」と入力し、Enter を押し、F8 を押すか、the Force Step Over button をクリックして 17 行目を実行します。

    現在の日を end プロパティの値として設定したため、アプリケーションはクラッシュしません。

    The current date is set as the end date
  4. このバグを修正するには、textDates() メソッドのコードを次のように置き換えます。

    func textDates() -> String { var result = start.dateToString() if let end = self.end { result = "\(result) - \(end.dateToString())" } return result }
  5. アプリケーションを実行し、ドット Swift 会議の説明がエラーなしで開くことを確認します。

条件付きブレークポイントを設定し、ウォッチに変数を追加する

問題

動員会議を選択すると、日が次のように表示されることに気付く場合があります。

Jan, 26 2019 - Jan, 26 2019

ソリューション

これは、textDates() メソッドが同じ開始日と終了日を持つ会議を正しく処理しないために発生します。1 日の会議で textDates() を呼び出す場合にのみ、プログラムの実行を停止する条件付きブレークポイントを追加しましょう。便宜上、ウォッチ式タブに会議データを表示します。

  1. 21 行目(Ctrl+F8)に新しいブレークポイントを設定し、ガターのアイコンをクリックして 17 行目で前のブレークポイントを削除します。

  2. 会議の終了日と開始日が同じ場合にのみ、新しいブレークポイントでプログラムの実行を停止する必要があります。この目的のために、特別な条件を作成できます。ブレークポイントを右クリックし、条件フィールドに end == start と入力します。

    Set a condition for the breakpoint
  3. アプリケーションをデバッグモード Shift+F9 で実行し、リストからランダムな会議を選択します。プログラムの実行は、指定された条件が満たされた場合にのみ停止します。たとえば、動員会議を選択した場合などです。

    The conditional breakpoint is hit
  4. プログラムが一時停止し、デバッガータブが使用可能になったら、result 変数をウォッチに追加します。これにより、別のタブで変数の状態を確認できます。これを行うには、変数タブで変数を右クリックし、ウォッチポイントに追加を選択します。現在ウォッチ式タブが非表示になっている場合は、Layout Settings ボタンをクリックして、リストからウォッチ式を選択します。

    The Watches tab

    監視したい変数をウォッチに追加できます。例: name 変数を追加して、現在の会議の名前を確認することもできます。

  5. バグを修正するには、等しい開始値と終了値を処理する条件を記述します。まず、ブレークポイントダイアログ Ctrl+Shift+F8評価して記録フィールドを使用して、実行時に結果値を変更します。

    The Evaluate and log field of the Breakpoints dialog
  6. プログラム実行 F9 を再開し、リストから他の会議を選択します。会議の終了日と開始日が同じである場合(たとえば、動員またはモバイル向けに最適化された 2019)、実行は停止します。ウォッチ式タブに、結果変数の正しい値が表示されます。

    The changed result
  7. 実行時に追加されたコードで問題が修正されたため、エディターでコードを追加して、アプリケーションの Shift+F10 を再実行できます。

    func textDates() -> String { var result = start.dateToString() if self.end == self.start{ return result } if let end = self.end { result = "\(result) - \(end.dateToString())" } return result }

シンボリックブレークポイントを設定し、逆アセンブリビューを操作する

問題

Swift リーズ会議を選択し、公式サイトにアクセスリンクをクリックします。アドレスにエラーが含まれているため、リンクされた Web ページを開くことができません。

ソリューション

シンボリックブレークポイントを使用してこのようなケースを処理しましょう。アプリケーションで URL が開かれるたびに、プログラムの実行を停止するブレークポイントを追加します。

  1. ブレークポイントダイアログ Ctrl+Shift+F8 に移動し、the Add button をクリックして、シンボリックブレークポイントを選択します。シンボル名フィールドに、次のように入力します。

    [UIApplication openURL:options:completionHandler:]
  2. Shift+F9 を押してデバッグを開始し、同じリンクを開きます。プログラムの実行は、シンボリックブレークポイントに指定されたメソッドで停止し、このメソッドの逆アセンブルされたコードが専用ビューに表示されます

    The Disassembly view
  3. デバッグツールウィンドウの LLDB タブに移動し、LLDB コンソールで次のコマンドを入力します。

    po $arg3

    これにより、デバッガーが停止したメソッドの最初のパラメーターが返されます。

    The LLDB console

    これは、open(_:options:completionHandler:) メソッドのパラメーターとして渡された無効な URL です。

  4. iOSConferences/Resources/conferencesData.json に移動し、誤植を修正します。

    { "name": "SwiftLeeds", "link": "http://swiftleeds.co.uk/", "start": "2020-10-07", "end": "2020-10-08", "location": "🇬🇧 Leeds, UK" }

次は何ですか

AppCode で使用可能なデバッグツールの詳細については、コードのデバッグセクションを参照してください。ビューのデバッグは、そのままの AppCode ではサポートされていませんが、この目的で Reveal アプリケーションを使用できます。詳細については、Reveal を使用した iOS アプリのデバッグを参照してください。Xcode でのデバッグに慣れている場合は、2 つの IDE の一般的な違いを指摘している移行ガイドを参照してください。

関連ページ:

AppCode で SwiftUI アプリケーションを作成する

このチュートリアルでは、iOS 会議のリストを表示する簡単な SwiftUI アプリケーションを作成します。アプリケーションは 2 つのビューで構成されます。ローカル JSON ファイルからのデータを表す会議のリスト。各会議の詳細。その過程で、AppCode 機能に慣れ、対話的な SwiftUI プレビューを有効にする方法を学びます。ビデオチュートリアルを見て、以下のステップバイステップの手順に従ってください。ステップ 1. プロジェクトの作成:AppCode で作成されたプロジェクトは、Xc...

ブレークポイント

ブレークポイントは、特定のポイントでプログラムの実行を一時停止する特別なマーカーです。これにより、プログラムの状態と動作を調べることができます。ブレークポイントは、単純な場合(たとえば、コード行に到達したときにプログラムを一時停止する場合)や、より複雑なロジック(追加の条件に対するチェック、ログメッセージの書き込みなど)を伴う場合があります。設定したブレークポイントは、一時的なブレークポイントを除いて、明示的に削除するまでプロジェクトに残ります)。ブレークポイントの種類:AppCode では、...

分解図

ソースコードが利用できない場合は、専用ビューで逆アセンブルしたコードにステップインしてデバッグできます。分解ビューを開くコードをデバッグするときは、ステップインの代わりに強制ステップインコマンドを使用してください。ステップインは、ソースコードのない関数ではステップオーバーのように機能します。デバッグ中に AppCode がソースファイルを見つけられない場合、逆アセンブリビューが自動的に開きます。ソースを明示的に指定するには、通知でファイルの選択をクリックします。デバッグツールウィンドウで目的のフ...

コードのデバッグ

C/C++ /Objective-C および Swift コードのデバッグには、AppCode は Xcode にバンドルされている LLDB デバッガーを使用します。インストール / 有効化されたプラグインに応じて、他の言語で記述されたコードをデバッグすることもできます。デバッグセッション中に、デバッガーをアタッチしてプログラムを起動します。デバッガーの目的は、プログラムの実行を妨害し、内部で何が起こっているかに関する情報を提供することです。これにより、プログラムのバグを検出して修正するプロセ...

Reveal を使用した iOS アプリのデバッグ

AppCode が明らかにするとの統合をサポート — 再コンパイルせずに実行中のアプリケーションのビューをその場で編集および変更できる iOS アプリケーションのデバッグ用ツールです。Reveal を使用すると、iOS アプリのビュー要素と階層を 2D および 3D の視覚化でリアルタイムにインスペクションし、ビューのレイアウトとレンダリングの問題をすばやくデバッグできます。始める前に環境設定ダイアログで、プラグイン | インストール済みに移動し、AppCode は統合を明らかにしますバンドルプ...

実行、デバッグ、プロファイル

デバイスとシミュレーター:AppCode は、そのままデバイスまたはシミュレーターでアプリケーションを実行およびデバッグします。ビルドシステムとデバッガー:AppCode は、Xcode にバンドルされたビルドシステムを使用してプロジェクトをビルドし、Xcode にバンドルされた LLDB ディストリビューションを使用してデバッグします。これにより、AppCode によってコンパイルされたバイナリが、Xcode で作成できるバイナリと同じになることが保証されます。スキームと実行 / デバッグ...