UWP アプリの展開とデバッグ

この記事では、さまざまな展開およびデバッグのターゲットを指定する手順について説明します。

Microsoft Visual Studio では、さまざまな Windows 10 デバイスにユニバーサル Windows プラットフォーム (UWP) アプリを展開してデバッグできます。 Visual Studio は、ターゲット デバイスにアプリを展開して登録するプロセスを処理します。

展開ターゲットの選択

ターゲットを選択するには、[デバッグの開始] ボタンの横にあるデバッグ ターゲットのドロップダウンに移動し、アプリの展開先のターゲットを選択します。 ターゲットを選択した後で、そのターゲットに展開してデバッグする場合は [デバッグの開始 (F5)] を選択し、単にそのターゲットに展開する場合は Ctrl + F5 キーを押します。

Debug device target list

  • [シミュレーター] は、現在の開発コンピューター上のシミュレートされた環境にアプリを展開します。 このオプションは、アプリの [ターゲット プラットフォームの最小バージョン] がご使用の開発マシンのオペレーティング システム以下である場合にのみ使用できます。
  • [ローカル コンピューター] は、現在の開発コンピューターにアプリを展開します。 このオプションは、アプリの [ターゲット プラットフォームの最小バージョン] がご使用の開発マシンのオペレーティング システム以下である場合にのみ使用できます。
  • [リモート コンピューター] では、アプリを展開するリモート ターゲットを指定できます。 リモート コンピューターへの展開について詳しくは、「リモート デバイスの指定」をご覧ください。
  • [デバイス] は、USB 接続のデバイスにアプリを展開します。 デバイスが開発者によりロック解除され、画面がロック解除されている必要があります。
  • [エミュレーター] ターゲットが起動し、名前で指定された構成のエミュレーターにアプリが展開されます。 エミュレーターは、Windows 8.1 以降を実行している Hyper-V 対応マシンでのみ使用できます。

展開されているアプリのデバッグ

Visual Studio では、[デバッグ][プロセスにアタッチ] の順に選ぶことによって、実行中の任意の UWP アプリ プロセスにアタッチすることもできます。 実行中のプロセスにアタッチする場合、元の Visual Studio プロジェクトは必要ありませんが、プロセスのシンボルを読み込むことは、元のコードを持たないプロセスのデバッグ時に非常に役立ちます。

さらに、[デバッグ][その他][インストールされているアプリケーション パッケージのデバッグ] を選択することによって、インストール済みのアプリ パッケージにアタッチしてデバッグすることができます。

Debug Installed App Package dialog box

[起動はしないが、開始時にコードをデバッグする] を選択すると、Visual Studio デバッガーは、UWP アプリが独自のタイミングで起動したときに、UWP アプリにアタッチします。 これは、カスタム パラメーターを使ったプロトコルのアクティブ化など、さまざまな起動方法からの制御パスをデバッグするのに効果的な方法です。

UWP アプリは、Windows 8.1 以降で開発してコンパイルすることができますが、実行するには Windows 10 が必要です。 Windows 8.1 PC で UWP アプリを開発している場合、別の Windows 10 デバイスで実行されている UWP アプリをリモートでデバッグできます。ただし、ホストとターゲットの両方のコンピューターが同じ LAN に接続されている必要があります。 これを行うには、両方のコンピューターに Remote Tools for Visual Studio をダウンロードしてインストールします。 インストールするバージョンはインストール済みの Visual Studio の既存のバージョンと一致している必要があり、選択するアーキテクチャ (x86、x64) もターゲット アプリのアーキテクチャと一致している必要があります。

パッケージのレイアウト

Visual Studio 2015 Update 3 で、開発者が UWP アプリのレイアウト パスを指定するためのオプションを追加しました。 これにより、アプリをビルドするときの、パッケージのレイアウトのディスク上でのコピー先を指定します。 既定では、このプロパティは、プロジェクトのルート ディレクトリに相対的に設定されます。 このプロパティを変更しない場合には、動作は Visual Studio の以前のバージョンと同じです。

このプロパティは、プロジェクトの デバッグ プロパティで変更できます。

アプリのパッケージを作成するときに、パッケージにすべてのレイアウト ファイルを含める場合には、プロジェクト プロパティ <IncludeLayoutFilesInPackage>true</IncludeLayoutFilesInPackage> を追加する必要があります。

このプロパティを追加するには、次のことを行います。

  1. プロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。
  2. プロジェクトを右クリックし、[[プロジェクト名].xxproj の編集] を選択します (.xxproj は、プロジェクトの言語に応じて変わります)。
  3. プロパティを追加し、プロジェクトを再度読み込みます。

リモート デバイスの指定

C# および Microsoft Visual Basic

C# または Microsoft Visual Basic のアプリのリモート コンピューターを指定するには、デバッグ ターゲットのドロップダウンで [リモート コンピューター] を選択します。 [リモート接続] ダイアログが表示され、IP アドレスを指定するか、または検出されたデバイスを選択できます。 既定では、[ユニバーサル] 認証モードが選択されます。 使用する認証モードを決定するには、「認証モード」をご覧ください。

Remote Connections dialog box

このダイアログに戻るには、プロジェクト プロパティを開き、[デバッグ] タブに移動します。そこから、[リモート コンピューター:] の横にある [検索…] を選択します。

Debug tab

Creators Update より前のリモート PC にアプリを展開するには、Visual Studio リモート ツールをターゲット PC にダウンロードしてインストールする必要もあります。 詳しい手順については、「リモート PC の手順」をご覧ください。 ただし、Creators Update の PC ではリモート展開もサポートされます。

C++ および JavaScript

C++ または JavaScript UWP アプリのリモート コンピューター ターゲットを指定するには:

  1. [ソリューション エクスプローラー] で、プロジェクトを右クリックし、[プロパティ] をクリックします。
  2. [デバッグ] 設定に移動し、[起動するデバッガー] の下で [リモート コンピューター] を選択します。
  3. [コンピューター名] を入力 (または [検索…] をクリックして検出) し、[認証の種類] プロパティを設定します。

Debug property pages

コンピューターを指定した後で、デバッグ ターゲットのドロップダウンで [リモート コンピューター] を選択し、その指定コンピューターに戻ることができます。 一度に選ぶことができるリモート コンピューターは 1 つだけです。

リモート PC の手順

注意

これらの手順は、以前のバージョンの Windows 10 でのみ必要です。 Creators Update の PC は、Xbox と同じように扱うことができます。 つまり、PC の開発者モード メニューでデバイスの検出を有効にし、ユニバーサル認証を使って PIN でペアリングして、PC に接続します。

Creators Update より前のリモート PC に展開するには、ターゲット PC に Visual Studio リモート ツールがインストールされている必要があります。 また、リモート PC がアプリの [ターゲット プラットフォームの最小バージョン] プロパティ以上の Windows バージョンを実行している必要もあります。 リモート ツールをインストールしたら、ターゲット PC でリモート デバッガーを起動する必要があります。

これを行うには、[スタート] メニューで [リモート デバッガー] を探して開き、プロンプトが表示されたらデバッガーがファイアウォール設定を構成できるようにします。 既定では、デバッガーは Windows 認証を使用して起動します。 両方の PC でサインイン ユーザーが同じでない場合、これにはユーザー資格情報が必要になります。

[認証なし] に変更するには、[リモート デバッガー][ツール] - >[オプション] の順にクリックし、[認証なし] に設定します。 リモート デバッガーを設定したら、ホスト デバイスが開発者モードに設定されていることを確認する必要があります。 その後、開発コンピューターから展開できます。

詳しくは、Visual Studio ダウンロード センターのページをご覧ください。

デバッグのコマンド ライン引数を渡す

Visual Studio 2019 では、UWP アプリケーションのデバッグを開始するときに、デバッグのコマンド ライン引数を渡すことができます。 デバッグのコマンド ライン引数には、Application クラスの OnLaunched メソッドで args パラメーターからアクセスすることができます。 デバッグのコマンド ライン引数を指定するには、プロジェクトのプロパティを開き、[デバッグ] タブに移動します。

注意

これは、Visual Studio 2017 (Version 15.1) で C#、VB、C++ について利用できます。 JavaScript は、将来のバージョンで利用できます。 デバッグのコマンド ライン引数は、シミュレーターを除くすべての種類の展開で利用できます。

C# と VB の UWP プロジェクトでは、[開始オプション][コマンド ライン引数] フィールドが表示されます。

Command line arguments

C++ と JS の UWP プロジェクトでは、[デバッグ プロパティ] のフィールドとして [コマンド ライン引数] が表示されます。

Screenshot of the App 4 Property Pages with Configuration Properties > Debugging option selected showing Command Line Arguments property isted in the table.

コマンド ライン引数を指定すると、アプリの OnLaunched メソッドで引数の値にアクセスすることができます。 LaunchActivatedEventArgs オブジェクト args は、値が [コマンド ライン引数] フィールドのテキストに設定された Arguments プロパティを持ちます。

Screenshot of command line arguments for C++ and JS.

認証モード

リモート コンピューターへの展開用に 3 つの認証モードがあります。

  • ユニバーサル (暗号化されていないプロトコル): リモート デバイスに展開するときは、必ずこの認証モードを使います。 これは現在、IoT デバイス、Xbox デバイス、HoloLens デバイスと、Windows バージョン 1703 (Creators Update) 以降を搭載した PC を対象としています。 ユニバーサル (暗号化されていないプロトコル) は、信頼されたネットワークで使う必要があります。 デバッグ接続は、開発マシンとリモート マシンとの間で渡されるデータを傍受して変更できる悪意のあるユーザーに対して脆弱です。
  • Windows: この認証モードは、Visual Studio リモート ツールを実行中のリモート PC (デスクトップまたはノート PC) に使用することのみを意図しています。 ターゲット コンピューターのサインイン ユーザーの資格情報にアクセスできる場合は、この認証モードを使用します。 これは、リモート展開用の最も安全なチャネルです。
  • なし: この認証モードは、Visual Studio リモート ツールを実行中のリモート PC (デスクトップまたはノート PC) に使用することのみを意図しています。 テスト アカウントがサインインしていて資格情報を入力できない環境にテスト コンピューターがセットアップされている場合は、この認証モードを使用します。 リモート デバッガーの設定が、"認証なし" を受け入れるようになっていることを確認してください。

高度なリモート配置オプション

Visual Studio 2015 Update 3 と Windows 10 Anniversary Update のリリースでは、特定の Windows 10 デバイス向けの、新しいリモート展開の詳細オプションがあります。 リモート展開の詳細オプションは、プロジェクト プロパティの [デバッグ] メニューにあります。

新しいプロパティには、次のものが含まれています。

  • 展開の種類
  • パッケージの登録パス
  • レイアウトの一部でなくなっているものも含め、デバイスのすべてのファイルを保持する

要件

リモート展開の詳細オプションを利用するには、次の要件を満たす必要があります。

  • Windows 10 Tools 1.4.1 以降 (Windows 10 Anniversary Update SDK を含む) で Visual Studio 2015 Update 3 またはそれ以降の Visual Studio リリースがインストールされていること。すべての最新の開発およびセキュリティ機能を取得できるように、更新された Visual Studio の最新バージョンの使用をお勧めします。
  • Windows 10 Anniversary Update の Xbox リモート デバイスまたは Windows 10 Creators Update の PC をターゲットにする
  • ユニバーサル認証モードを使う

プロパティ ページ

C# または Visual Basic の UWP アプリでは、プロパティ ページは、次のようになります。

CS or VB properties

C++ UWP アプリでは、プロパティ ページは次のようになります。

Cpp properties

デバイスにファイルをコピーする

[デバイスにファイルをコピーする] ファイルをリモート デバイスにネットワークを介して物理的に転送します。 レイアウト フォルダー パスにビルドされたパッケージ レイアウトをコピーして登録します。 Visual Studio は、Visual Studio プロジェクト内のファイルと同期してデバイスにコピーされるファイルを保持します。ただし、[レイアウトの一部でなくなっているものも含め、デバイスのすべてのファイルを保持する] のオプションがあります。 このオプションを選択すると、リモート デバイスに以前にコピーされたが、プロジェクトの一部ではなくなったファイルも、リモート デバイス上で維持されます。

[デバイスにファイルをコピーする] で指定するパッケージ登録パスは、コピー先リモート デバイスの物理的な場所です。 このパスは、任意の相対パスとして指定することができます。 ファイルが展開される場所は、開発ファイルのルートからの相対的な場所となり、ターゲット デバイスによって異なります。 複数の開発者が同じデバイスを共有し、いくつかの異なるビルドのパッケージに作業を行っている場合に、このパスを指定すると便利です。

注意

[デバイスにファイルをコピーする] は現在、Windows 10 Anniversary Update を搭載した Xbox と、Windows 10 Creators Update を搭載した PC でサポートされています。

リモート デバイスでは、レイアウトは次の既定の場所にコピーされます。\\MY-DEVKIT\DevelopmentFiles\PACKAGE-REGISTRATION-PATH

ネットワークからレイアウトを登録する

ネットワークからレイアウトを登録する場合には、パッケージ レイアウトをネットワーク共有にビルドでき、ネットワークから直接レイアウトをリモート デバイスに登録できます。 これには、リモート デバイスからアクセス可能なレイアウト フォルダー パス (ネットワーク共有) を指定する必要があります。 [レイアウト フォルダー パス] プロパティは、Visual Studio を実行している PC からの相対パスで、[パッケージ登録パス] プロパティは、同じパスですが、リモート デバイスからの相対パスです。

ネットワークからレイアウトを正常に登録するには、まず [レイアウト フォルダー パス] を共有ネットワーク フォルダーにする必要があります。 これを行うには、エクスプローラーでフォルダーを右クリックして、[共有] > [特定のユーザー] を選択し、フォルダーを共有するユーザーを選択します。 ネットワークからレイアウトを登録する場合、共有へのアクセスを持つユーザーとして登録することを確認するため、資格情報を求められます。

これについては、次の例をご覧ください。

  • 例 1 (ネットワーク共有としてアクセス可能な、ローカル レイアウト フォルダー):

    • レイアウト フォルダー パス = D:\Layouts\App1
    • パッケージの登録パス = \\NETWORK-SHARE\Layouts\App1
  • 例 2 (ネットワーク レイアウト フォルダー):

    • レイアウト フォルダー パス = \\NETWORK-SHARE\Layouts\App1
    • パッケージの登録パス = \\NETWORK-SHARE\Layouts\App1

最初にネットワークからレイアウトを登録するときに、ターゲット デバイスに資格情報がキャッシュされるため、繰り返しサインインする必要はありません。 キャッシュされた資格情報を削除するには、Windows 10 SDK の WinAppDeployCmd.exe ツールdeletecreds コマンド を使用できます。

ネットワークからレイアウトを登録する場合には、ファイルは物理的にリモート デバイスにコピーされないため、[デバイスのすべてのファイルを保持する] を選択することはできません。

注意

[ネットワークからレイアウトを登録する] は現在、Windows 10 Anniversary Update を搭載した Xbox と、Windows 10 Creators Update を搭載した PC でサポートされています。

リモート デバイスでは、デバイス ファミリに応じて、既定の場所である Xbox: \\MY-DEVKIT\DevelopmentFiles\XrfsFiles にレイアウトが登録されます。これはパッケージ登録パスへのシンボリック リンクです。PC ではシンボリック リンクは使われず、代わりにパッケージ登録パスが直接登録されます。

デバッグ オプション

Windows 10 では、事前起動と呼ばれる手法でアプリを事前に起動してから中断することにより、UWP アプリの起動パフォーマンスが向上します。 多くのアプリはこのモードで動作するために特別に何もする必要はありませんが、一部のアプリでは動作を調整する必要があります。 これらのコード パスの問題をデバッグするために、事前起動モードで Visual Studio からアプリのデバッグを開始できます。

デバッグは、Visual Studio プロジェクト ([デバッグ] ->[その他のデバッグ ターゲット] ->[ユニバーサル Windows アプリ事前起動のデバッグ])、および既にコンピューターにインストールされているアプリ ([デバッグ] ->[その他のデバッグ ターゲット] ->[インストールされているアプリケーション パッケージのデバッグ][事前起動を使用してアプリをアクティブ化] のチェック ボックスをオンにする) の両方でサポートされます。 詳しくは、「事前起動 UWP をデバッグする」をご覧ください。

スタートアップ プロジェクトの [デバッグ] プロパティ ページで、次の展開オプションを設定できます。

  • ローカル ネットワーク ループバックの許可

    セキュリティ上の理由で、標準的な方法でインストールされた UWP アプリでは、それがインストールされているデバイスに対してネットワーク呼び出しを実行することは許可されません。 既定では、Visual Studio による配置では、配置されたアプリに対するこの規則の適用は免除されます。 この免除によって、1 台のコンピューター上で通信プロシージャをテストできます。 アプリを Microsoft Store に申請する前に、この除外を使用せずにアプリをテストする必要があります。

    アプリからネットワーク ループバックの適用除外を削除するには

    • C# および Visual Basic の [デバッグ] プロパティ ページで、[ローカル ネットワーク ループバックの許可] チェック ボックスをオフにします。
    • JavaScript および C++ の [デバッグ] プロパティ ページで、[ローカル ネットワーク ループバックの許可] の値を [いいえ] に設定します。
  • 起動はしないが、開始時にコードをデバッグする / アプリケーションを起動

    アプリが起動した場合はデバッグ セッションを自動駅に開始するように、配置を構成するには

    • C# および Visual Basic の [デバッグ] プロパティ ページで、[起動はしないが、開始時にコードをデバッグする] チェック ボックスをオンにします。
    • JavaScript および C++ の [デバッグ] プロパティ ページで、[アプリの起動] 値を [はい] に設定します。

シンボル

シンボル ファイルには、変数、関数名、エントリ ポイントのアドレスなど、コードをデバッグするときに非常に便利な値が格納されており、例外とコールスタックの実行順序を把握することができます。 ほとんどの種類の Windows のシンボルは、Microsoft シンボル サーバーから利用することも、高速にオフラインで参照できるように Windows シンボル パッケージのダウンロード サイトからダウンロードすることもできます。

Visual Studio のシンボル オプションを設定するには、[ツール] > [オプション] を選択し、ダイアログ ウィンドウで [デバッグ] > [シンボル] の順に移動します。

Options dialog box

WinDbg を使ってデバッグ セッションでシンボルを読み込むには、sympath 変数をシンボル パッケージの場所に設定します。 たとえば、次のコマンドを実行すると、Microsoft シンボル サーバーからシンボルが読み込まれ、C:\Symbols ディレクトリにキャッシュされます。

.sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
.reload

区切り文字 ‘;’ を使用して複数のパスを追加することも、.sympath+ コマンドを使用することもできます。 WinDbg を使用する高度なシンボル操作については、「パブリック シンボルとプライベート シンボル」をご覧ください。

WinDbg

WinDbg は、Windows SDK に含まれる、Debugging Tools for Windows の一部として出荷される強力なデバッガーです。 Windows SDK のインストールでは、スタンドアロン製品として Debugging Tools for Windows をインストールすることができます。 ネイティブ コードのデバッグには非常に便利ですが、マネージ コードや HTML5 で記述されたアプリについては WinDbg の使用をお勧めできません。

UWP アプリで WinDbg を使用するには、まず PLMDebug を使用して、アプリ パッケージのプロセス ライフタイム管理 (PLM) を無効にする必要があります。これについては「プロセス ライフタイム管理 (PLM) のテスト ツールとデバッグ ツール」で説明されています。

plmdebug /enableDebug [PackageFullName] ""C:\Program Files\Debugging Tools for Windows (x64)\WinDbg.exe\" -server npipe:pipe=test"

Visual Studio とは対照的に、WinDbg のコア機能の多くは、コマンド ウィンドウにコマンドを入力する必要があります。 入力したコマンドによって、実行状態の表示、ユーザー モードのクラッシュ ダンプの調査、さまざまなモードでのデバッグを行うことができます。

WinDbg で最もよく使用されるコマンドの 1 つが !analyze -v であり、次のように、現在の例外に関する詳細な情報を取得するために使用されます。

  • FAULTING_IP: 障害発生時の命令ポインター
  • EXCEPTION_RECORD: 現在の例外のアドレス、コード、フラグ
  • STACK_TEXT: 例外の前のスタック トレース

WinDbg のすべてのコマンドの一覧については、「デバッガー コマンド」をご覧ください。