Xamarin.iOS アプリのデバッグ

Xamarin.iOS アプリケーションは Visual Studio for Mac や Visual Studio に内蔵されているデバッガーでデバッグできます。

C# やその他のマネージド言語コードのデバッグには、Visual Studio for Mac のネイティブ デバッグ サポートを利用します。Xamarin.iOS プロジェクトにリンクする可能性がある C、C++、Objective C コードのデバッグには、LLDB を利用します。

注意

デバッグ モードでアプリケーションをコンパイルすると、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 のクラス ライブラリのデバッグ

完了したら、アプリケーションを起動し、Mono のコア クラス ライブラリをシングル ステップ実行できます。