Xamarin.iOS アプリのデバッグ
Xamarin.iOS アプリケーションは Visual Studio for Mac や Visual Studio に内蔵されているデバッガーでデバッグできます。
C# やその他の管理対象言語コードのデバッグには、Visual Studio for Mac のネイティブ デバッグ サポートを利用します。Xamarin.iOS プロジェクトにリンクする可能性がある C、C++、Objective C コードのデバッグには、LLDB を利用します。
Note
デバッグ モードでアプリケーションをコンパイルすると、Xamarin.iOS は動作が遅く、大容量のアプリケーションを生成します。すべてのコード行をインストルメント化しなければならないためです。 リリース前に、必ずリリース ビルドを行ってください。
Xamarin.iOS デバッガーは IDE に統合されており、開発者はシミュレーターまたはデバイスで、Xamarin.iOS が対応している管理対象言語でビルドされた Xamarin.iOS アプリケーションをデバッグできます。
Xamarin.iOS デバッガーは Mono Soft Debugger を利用します。つまり、生成されたコードと Mono ランタイムが IDE と連動してデバッグを行います。 これが LLDB や MDB のようなハード デバッガーとの違いです。ハード デバッガーは、デバッグされるプログラムから情報や協力を得ることなくプログラムを制御します。
ブレークポイントの設定
アプリケーションのデバッグを始める準備ができたら、まずアプリケーションのブレークポイントを設定します。 エディターの余白領域で、ブレークポイントにするコードの行番号の隣をクリックします。
コードに設定したすべてのブレークポイントを表示するには、[ブレークポイント] パッドを開きます。
[ブレークポイント] パッドが自動的に表示されない場合、[表示] > [デバッグ ウィンドウ] > [ブレークポイント] の順に選択すると表示されます
アプリケーションのデバッグを始める前に、構成が [デバッグ] に設定されていることを必ず確認してください。この構成には、ブレークポイント、データ ビジュアライザーの使用、コール スタックの表示など、デバッグに役立つ便利なツールが揃っています。
[デバッグの開始]
デバッグを開始するには、IDE でターゲット デバイスまたは類似するデバイスを選択します。
[再生] ボタンを押してアプリケーションを展開します。
ブレークポイントにヒットすると、コードは黄色で強調表示されます。
オブジェクト値の検査ツールなど、デバッグ ツールをこの時点で使用すると、コードの状態を詳しく確認できます。
条件付きブレークポイント
ブレークポイントが発生する状況を指示した規則を設定することもできます。これは条件付きブレークポイントの追加とも呼ばれます。
条件付きブレークポイントを設定するには、[ブレークポイントのプロパティ] ウィンドウにアクセスします。アクセスする方法は 2 つあります。
新しい条件付きブレークポイントを追加するには、ブレークポイントを設定するコードの行番号の左にあるエディターの余白を右クリックし、[ブレークポイントの作成] を選択します。
既存のブレークポイントに条件を追加するには、ブレークポイントを右クリックし、[ブレークポイントのプロパティ] を選択します。あるいはブレークポイント パッドで、次の画像にあるプロパティを選択します。
この画面で、ブレークポイントが発生する条件を入力できます。
コード間を移動する
デバッグ ツールでは、ブレークポイントに達すると、プログラムの実行を制御できます。 IDE には、コードの実行とステップ実行に使用できるボタンが 4 つ表示されます。
Visual Studio for Mac では次のように表示されます。
次のとおりです。
- 再生/停止 - コードの実行が開始され、次のブレークポイントまで実行されます。あるいは、コードの実行を停止します。
- ステップ オーバー - 次のコード行が実行されます。 次行が関数呼び出しの場合、[ステップ オーバー] をクリックするとその関数が実行され、関数の後の次のコード行で停止します。
- ステップ イン - このボタンの場合も次のコード行が実行されます。 次行が関数呼び出しの場合、[ステップ イン] をクリックすると関数の最初の行で停止するので、関数のデバッグを 1 行ずつ続行できます。 次行が関数ではない場合の動作は、[ステップ オーバー] と同じです。
- ステップ アウト - 現在の関数が呼び出された行に戻ります。
ブレークポイント
これは重要なことですが、アプリケーションが起動し、アプリケーション デリゲートで FinishedLaunching
メソッドを完了するための時間として iOS はアプリケーションに 10 秒だけ与えます。 アプリケーションが 10 秒以内にこのメソッドを完了しない場合、iOS はプロセスを終了します。
つまり、プログラムの起動コードにブレークポイントを設定することはほぼ不可能です。 起動コードをデバッグする場合、その初期化の一部を遅らせ、それをタイマーで呼び出されるメソッドか、FinishedLaunching の終了後に実行される他の形態のコールバック メソッドに入れてください。
デバイス診断
デバッガーの設定中にエラーが発生した場合、プロジェクト オプションの追加 mtouch 引数に "-v -v -v" を追加すれば、詳しく診断できます。 デバイスのコンソールに詳しいエラー情報が出力されます。
ワイヤレス デバッグ
Xamarin.iOS の初期設定では、USB で接続されているデバイスのアプリケーションをデバッグします。 外部アクセサリーを使用するアプリケーションの開発で、ケーブルを差し込んだり、抜いたりしてテストするとき、USB デバイスが必要になることもあります。 そのような場合、無線ネットワークでデバッグできます。
ワイヤレス展開およびデバッグについて詳しくは、「ワイヤレス展開」ガイドをご覧ください。
技術的な詳細
Xamarin.iOS は新しい Mono Soft Debugger を使用します。 オペレーティング システムのインターフェイスで個々のプロセスを制御するプログラムである標準の Mono Debugger とは異なり、このソフト デバッガーは Mono ランタイムにワイヤー プロトコル経由でデバッグ機能を公開させることで機能します。
起動時、デバッグ対象のアプリケーションはデバッガーに接触し、デバッガーは動作を開始します。 Xamarin.iOS for Visual Studio の場合、Xamarin Mac Agent は (Visual Studio の) アプリケーションとデバッガーの間の仲介として機能します。
このソフト デバッガーは、デバイスで実行時、連携するデバッグ スキームを必要とします。 つまり、デバッグのためにコードがインストルメント化され、すべてのシーケンス ポイントで余計なコードが含まれるため、デバッグ時のバイナリ ビルドが大きくなります。
コンソールにアクセスする
クラッシュ ログとコンソール クラスの出力は iPhone コンソールに送信されます。 このコンソールには Xcode でアクセスできます。"オーガナイザー" を利用し、オーガナイザーからデバイスを選択します。
あるいは、Xcode を起動しない場合、Apple の iPhone Configuration Utility を利用してコンソールに直接アクセスできます。 これにはさらに良いことがあります。現場である問題をデバッグしているとき、Windows マシンからコンソール ログにアクセスできます。
Visual Studio をご利用の場合、出力ウィンドウにもログがありますが、Mac に切り替え、完全なログを参照してください。
Mono のクラス ライブラリのデバッグ
Xamarin.iOS には Mono のクラス ライブラリのソース コードが付属しているため、そのソース コードを利用してデバッガーからシングル ステップ実行し、内部でどのような処理が実行されているかを確認できます。
この機能はデバッグ中に大量のメモリを使用するため、既定ではオフになっています。
この機能を有効にするには、下の画像のように、[Visual Studio for Mac] > [環境設定] > [デバッガー] メニューで [プロジェクト コードのみをデバッグします。フレームワーク コードにはステップ インしません] オプションの選択を解除します。
完了したら、アプリケーションを起動し、Mono のコア クラス ライブラリをシングル ステップ実行できます。