Xamarin.Mac のトラブルシューティングのヒント
概要
プロジェクトを進めていく中で、API が思ったように動作しなかったり、バグを回避しようとしたりして行き詰まることがあります。 Xamarin における目標は、モバイル アプリケーションとデスクトップ アプリケーションを正常に作成していただくことなので、有用なリソースを提供しています。
これらのリソースでは、問題を迅速に解決するために実行できる準備手順がいくつかあります。
クラッシュを報告するために問題の根本原因を可能な限り特定します。
"アプリケーションがクラッシュしました" では、根本原因を診断するのは困難です。 "この呼び出しに空の配列を返すとアプリケーションがクラッシュします"という方が、修正作業がはるかに簡単です。
"この場合、NSTableDelegate のメソッドが呼び出されていないようです" という方が、"NSTable を動作させることはできません" よりも調査において有益です。
可能であれば、問題を示す小さなサンプル プログラムを提供してください。 ソース コードを何ページも掘り下げて問題を探すのは、時間も労力も桁違いにかかります。
アプリケーションにどのような変更を加えて問題が発生したかを把握することで、問題の根本原因を迅速に絞り込むことができます。 Xamarin.Mac のバージョンを最近アップグレードした場合、アプリケーションのセクションを切り取って問題の原因となっている部分を探したり、以前のビルドをテストして問題の原因となった変更を探したりすることは、問題の原因調査に非常に役立ちます。
アプリがクラッシュして何も出力されない場合の対処法
ほとんどの場合、Visual Studio for Mac のデバッガーは、アプリケーションで例外とクラッシュを検出するため、根本原因を追跡するのに役立ちます。 ただし、アプリケーションがドック上でバウンスし、ほとんど何も出力されずに終了する場合もあります。 次のようなものがあります。
- コード署名の問題。
- 特定の mono ランタイムがクラッシュします。
- 一部の Objective-c 例外とクラッシュ。
- プロセスの有効期間の非常に早い段階でクラッシュすることもあります。
- 一部のスタック オーバーフロー。
- Info.plist に一覧表示されている macOS のバージョンが、現在インストールされている macOS バージョンよりも新しいか、無効です。
これらのプログラムのデバッグは、必要な情報を見つけるのが難しい場合があります。 ここでは、役に立つ可能性のあるいくつかの方法を紹介します。
Info.plist に一覧表示されている macOS のバージョンが、現在コンピューターにインストールされている macOS のバージョンと同じであることを確認します。
Visual Studio for Mac アプリケーションの出力 ([ビュー] ->[Pad] ->[アプリケーションの出力]) で、スタック トレースや Cocoa からの赤字の出力を確認してください。
コマンド ラインからアプリケーションを実行し、次のコマンドを使用して (ターミナル アプリで) 出力を確認します。
MyApp.app/Contents/MacOS/MyApp
(MyApp
はアプリケーションの名前です)コマンド ラインでコマンドに "MONO_LOG_LEVEL" を追加すれば、出力を増やすことができます。次に例を示します。
MONO_LOG_LEVEL=debug MyApp.app/Contents/MacOS/MyApp
ネイティブ デバッガー (
lldb
) をプロセスにアタッチして、より多くの情報が提供されているかどうかを確認できます (これには有料ライセンスが必要です)。 たとえば、次の手順を行います。- ターミナルに「
lldb MyApp.app/Contents/MacOS/MyApp
」と入力します。 - ターミナルに「
run
」と入力します。 - ターミナルに「
c
」と入力します。 - デバッグが完了したら終了します。
- ターミナルに「
最後の手段として、
Main
メソッド (または必要に応じて他の場所) でNSApplication.Init
を呼び出す前に、既知の場所にあるファイルにテキストを書き込んで、起動のどの段階で問題が発生しているかを追跡できます。
既知の問題
次のセクションでは、既知の問題とその解決策について説明します。
サンドボックス アプリでデバッガーに接続できない
デバッガーは TCP 経由で Xamarin.Mac アプリに接続します。つまり、サンドボックスを有効にすると、既定ではアプリに接続できなくなります。そのため、適切なアクセス許可を有効にせずにアプリを実行しようとすると、エラー "デバッガーに接続できません" を受け取ります。
[送信ネットワーク接続を許可する (クライアント)] アクセス許可はデバッガーに必要なものであり、これを有効にすると通常どおりにデバッグできるようになります。 これなしではデバッグできないため、msbuild
の CompileEntitlements
ターゲットを更新し、デバッグ ビルド専用のサンドボックス化されたアプリのエンタイトルメントにそのアクセス許可を自動的に追加しました。 リリース ビルドでは、エンタイトルメント ファイルに指定されたエンタイトルメントを変更せずに使う必要があります。
System.NotSupportedException: エンコード 437 に使用できるデータがありません
Xamarin.Mac アプリにサード パーティ製ライブラリを含めるときに、アプリをコンパイルして実行しようとすると、"System.NotSupportedException: エンコード 437 に使用できるデータがありません" という形式でエラーが発生する可能性があります。 たとえば、ライブラリ (Ionic.Zip.ZipFile
など) は、操作中にこの例外をスローする場合があります。
この例外は、Xamarin.Mac プロジェクトのオプションを開き、[Mac ビルド] > [国際化] に移動し、[West] (西) の国際化であることを確認することで解決できます。
コンパイルに失敗しました (mm5103)
このエラーは通常、Xcode の新しいバージョンがリリースされ、新しいバージョンをインストールしたがまだ実行していない場合に発生します。 新しいバージョンの Xcode でコンパイルする前に、まず少なくとも 1 回は、そのバージョンを実行する必要があります。
新しいバージョンの Xcode を初めて実行すると、Xamarin.Mac に必要なコマンド ライン ツールがいくつかインストールされます。 さらに、Xcode または Xamarin.Mac のバージョンを更新した後は、クリーン ビルドを実行する必要があります。
この問題を解決できない場合は、バグを報告してください。
entitlements.plist が見つかりません
最新バージョンの Visual Studio for Mac では、Info.plist エディターから Entitlements セクションが削除され、別の Entitlements.plist エディターに配置されています (Xamarin.iOS とのクロスプラットフォーム サポートの向上のため)。
新しい Visual Studio for Mac がインストールされると、新しい Xamarin.Mac アプリ プロジェクトを作成するときに、Entitlements.plist ファイルがプロジェクト ツリーに自動的に追加されます。
Entitlements.plist ファイルをダブルクリックすると、エンタイトルメント エディターが表示されます。
既存の Xamarin.Mac プロジェクトの場合は、Solution Pad でプロジェクトを右クリックし、[追加]>[新しいファイル...] を選択して、Entitlements.plist ファイルを手動で作成する必要があります。次に、[Xamarin.Mac]>[空のプロパティ リスト] を選択します。
名前に「Entitlements
」と入力し、[新規] ボタンをクリックします。 プロジェクトに以前エンタイトルメント ファイルが含まれていた場合は、新しいファイルを作成する代わりに、そのファイルをプロジェクトに追加するように求められます。
フォーラムでのコミュニティ サポート
Xamarin 製品を使用する開発者のコミュニティはすばらしいものであり、多くの開発者が Xamarin.Mac フォーラムにアクセスして、エクスペリエンスとその専門知識を共有しています。 さらに、Xamarin エンジニアが定期的にフォーラムにアクセスしてサポートします。
バグ報告
お客様のフィードバックは Microsoft にとって重要です。 Xamarin.Mac で何か問題を見つけた場合:
- 問題リポジトリを検索する
- 一致する問題が見つからない場合は、GitHub の問題リポジトリに新しい問題を提出してください。
GitHub の問題はすべて公開されています。 コメントまたは添付ファイルを非表示にすることはできません。
次の情報について、できるだけ多くを含めてください。
- 問題を再現する簡単な例。 これは重要です (可能な場合)。
- クラッシュの完全なスタック トレース。
- クラッシュの周囲の C# コード。