バックグラウンド タスクのデバッグ

重要な API

バックグラウンド タスクをデバッグする方法について説明します。バックグラウンド タスクのアクティブ化のほか、Windows イベント ログでのデバッグ トレースなどについて取り上げます。

アウトプロセス バックグラウンド タスクのデバッグとインプロセス バックグラウンド タスクのデバッグ

このトピックでは主に、ホスト アプリとは別のプロセスで実行されているバックグラウンド タスクについて扱います。 インプロセス バックグラウンド タスクをデバッグする場合、別個のバックグラウンド タスク プロジェクト タスクはいらず、OnBackgroundActivated() (インプロセス バックグラウンド コードが実行される場所) にブレークポイントを設定できます。実行するバックグラウンド コードをトリガーする手順については、以下の「バックグラウンド タスク コードをデバッグするためバックグラウンド タスクを手動でトリガー」のセクションの手順 2. を参照してください。

バックグラウンド タスク プロジェクトが正しく設定されていることを確認

このトピックは、デバッグ対象のバックグラウンド タスクを備えたアプリが既に手元にあることを前提としています。 以下の内容は、アウトプロセスで実行されるバックグラウンド タスクに固有の内容であり、インプロセス バックグラウンド タスクには適用されません。

  • C# と C++ の場合、メイン プロジェクトがバックグラウンド タスク プロジェクトを参照していることを確認します。 この参照が行われない場合、アプリ パッケージにバックグラウンド タスクが含まれていない可能性があります。
  • C# と C++ の場合、バックグラウンド タスク プロジェクトの [出力の種類] が "Windows ランタイム コンポーネント" になっていることを確認します。
  • バックグラウンド クラスは、パッケージ マニフェストのエントリ ポイント属性で宣言されている必要があります。

バックグラウンド タスク コードをデバッグするためバックグラウンド タスクを手動でトリガー

バックグラウンド タスクは、Microsoft Visual Studio を使って手動でトリガーできます。 その後で、コードをステップ実行してデバッグできます。

  1. C# では、バックグラウンド クラスの Run メソッドにブレークポイントを置き (インプロセス バックグラウンド タスクの場合は、App.OnBackgroundActivated() にブレークポイントを置きます)、System.Diagnostics を使ってデバッグ出力を記述します。

    C++ では、バックグラウンド クラスの Run 関数にブレークポイントを置き (インプロセス バックグラウンド タスクの場合は、App.OnBackgroundActivated() にブレークポイントを置きます)、OutputDebugString を使ってデバッグ出力を記述します。

  2. デバッガーでアプリケーションを実行し、[ライフサイクル イベント] ツール バーを使ってバックグラウンド タスクをトリガーします。 このドロップダウンには、Visual Studio でアクティブ化できるバックグラウンド タスクの名前が表示されます。

    注意

    Visual Studio で、[ライフサイクル イベント] ツール バーのオプションは、既定では表示されません。 これらのオプションを表示するには、Visual Studio で現在のツール バーを右クリックし、[デバッグの場所] オプションがオンになっていることを確認します。

    この機能を使うには、バックグラウンド タスクが既に登録されていて、トリガーを待機する状態になっていることが必要です。 たとえば、1 回限りの TimeTrigger に対してバックグラウンド タスクを登録した場合、そのトリガーが起動された後に Visual Studio からそのタスクを起動しても何も起こりません。

    注意

    この方法では、アプリケーション トリガーMediaProcessing トリガーControlChannelTriggerPushNotificationTrigger を使用するバックグラウンド タスクをアクティブ化することはできません。また、SmsReceived トリガー型の SystemTrigger を使用するバックグラウンド タスクも、この方法でアクティブ化することはできません。
    Application triggerMediaProcessingTrigger は、trigger.RequestAsync() を使ってコードで手動通知できます。

    バックグラウンド タスクのデバッグ

  3. バックグラウンド タスクがアクティブになると、デバッガーがアタッチされて、デバッグ出力が VS に表示されます。

バックグラウンド タスクのアクティブ化のデバッグ

注意

このセクションは、アウトプロセスで実行されるバックグラウンド タスクに固有の内容であり、インプロセス バックグラウンド タスクには適用されません。

バックグラウンド タスクのアクティブ化は、次の 3 つの点に依存します。

  • バック グラウンド タスク クラスの名前と名前空間
  • パッケージ マニフェストで指定されたエントリ ポイント属性
  • バックグラウンド タスクの登録時にアプリによって指定されたエントリ ポイント
  1. Visual Studio を使い、バックグラウンド タスクのエントリ ポイントを確認します。

    • C# と C++ の場合、バックグラウンド タスク プロジェクトで指定されたバックグラウンド タスク クラスの名前と名前空間を確認します。
  2. マニフェスト デザイナーを使い、バックグラウンド タスクがパッケージ マニフェストで正しく宣言されているかどうかを確認します。

    • C# と C++ の場合、エントリ ポイント属性が、クラス名の前のバックグラウンド タスク名前空間と一致している必要があります。 たとえば、RuntimeComponent1.MyBackgroundTask のようになります。
    • タスクと共に使われるトリガー タイプがすべて指定されている必要があります。
    • ControlChannelTrigger または PushNotificationTrigger を使う場合以外、実行可能ファイルを指定しないでください。
  3. Windows のみ。 バックグラウンド タスクをアクティブ化するために Windows で使われるエントリ ポイントを確認するには、デバッグ トレースを有効にして Windows イベント ログを使います。

    この手順を実行し、その結果イベント ログにバックグラウンド タスクの間違ったエントリ ポイントまたはトリガーが表示される場合は、アプリにバックグラウンド タスクが正しく登録されていません。 このタスクのヘルプが必要な場合は、「バックグラウンド タスクの登録」をご覧ください。

    1. スタート画面に移動して eventvwr.exe を検索し、イベント ビューアーを開きます。
    2. イベント ビューアーで、[アプリケーションとサービス ログ] ->[Microsoft] ->[Windows] ->[BackgroundTaskInfrastructure] の順に移動します。
    3. 操作ペインで、[表示] ->[分析およびデバッグ ログの表示] の順に選択して、診断ログを有効にします。
    4. 診断ログを選び、[ログの有効化] をクリックします。
    5. 次に、アプリを使ってバックグラウンド タスクの登録とアクティブ化をもう一度試します。
    6. 診断ログで、詳しいエラー情報を確認します。 このログには、バックグラウンド タスクに登録されたエントリ ポイントが含まれます。

イベント ビューアーでバックグラウンド タスクのデバッグ情報を表示

バックグラウンド タスクと Visual Studio パッケージの展開

バックグラウンド タスクを使用するアプリが Visual Studio を使ってデプロイされ、その後、マニフェスト デザイナーで指定されたバージョン (メジャー バージョンとマイナー バージョン、またはそのどちらか一方) が更新された場合、以後に Visual Studio を使用してそのアプリを再デプロイすると、アプリのバックグラウンド タスクが停止することがあります。 これは、次のようにして対処できます。

  • 更新したアプリを (Visual Studio ではなく) Windows PowerShell を使って展開します。パッケージと一緒に生成されるスクリプトを実行してください。
  • 既に Visual Studio を使用してアプリをデプロイし、アプリのバックグラウンド タスクが停止している場合、アプリのバックグラウンド タスクをもう一度作動させるには、再起動するか、いったんログオフしてからログインし直します。
  • C# プロジェクトでは、"パッケージを常に再インストール" というデバッグ オプションを選ぶことで、この問題を回避することができます。
  • デプロイ用にアプリが最終確定するのを待ってから、パッケージのバージョンをインクリメントします (デバッグ中は変更しません)。

注釈

  • バックグラウンド タスクは、同じバックグラウンド タスクが登録されていないことをアプリ側で必ずチェックしたうえで登録してください。 同じバックグラウンド タスクを重複して登録すると、1 回のトリガーにつきバックグラウンド タスクが複数回実行され、予期しない結果を招きます。
  • バックグラウンド タスクがロック画面へのアクセスを必要とする場合は、バックグラウンド タスクをデバッグする前にロック画面にアプリを配置してください。 ロック画面対応アプリのマニフェスト オプションを指定する方法については、「アプリケーション マニフェストでのバックグラウンド タスクの宣言」をご覧ください。
  • バックグラウンド タスクの登録パラメーターは登録時に検証されます。 いずれかの登録パラメーターが有効でない場合は、エラーが返されます。 バックグラウンド タスクの登録が失敗するシナリオをアプリが適切に処理するようにします。タスクを登録しようとした後で、有効な登録オブジェクトを持っていることを前提として動作するアプリは、クラッシュする場合があります。

VS を使ってバックグラウンド タスクをデバッグする方法の詳細については、UWP アプリで中断、再開、およびバックグラウンドのイベントをトリガーする方法に関するページを参照してください。