バックグラウンド タスクをデバッグする方法 (Windows ランタイム アプリ)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
バックグラウンド タスクをデバッグする方法について説明します。バックグラウンド タスクのアクティブ化のほか、Windows イベント ログでのデバッグ トレースなどについて取り上げます。
理解しておく必要があること
テクノロジ
必要条件
- このトピックは、デバッグ対象のバックグラウンド タスクを備えたアプリが既に手元にあることを前提としています。
手順
バックグラウンド タスク プロジェクトが正しく設定されていることを確認
- C# と C++ の場合、メイン プロジェクトがバックグラウンド タスク プロジェクトを参照していることを確認します。この参照が行われない場合、アプリ パッケージにバックグラウンド タスクが含まれていない可能性があります。エントリ ポイント属性を使います。
- C# と C++ の場合、バックグラウンド タスク プロジェクトの Output type が "WinMD ファイル"になっていることを確認します。
- JavaScript の場合、バックグラウンド タスク ワーカーが、専用の JavaScript ファイルに存在している必要があります。
- バックグラウンド タスクがパッケージ マニフェストで宣言されている必要があります。JavaScript タスクは開始ページ属性を使って宣言し、他のタスクはエントリ ポイント属性を使って宣言します。
バックグラウンド タスク コードをデバッグするためバックグラウンド タスクを手動でトリガー
バックグラウンド タスクは、Microsoft Visual Studio Express 2012 for Windows 8 を使って手動でトリガーできます。その後で、コードをステップ実行してデバッグできます。
C# の場合、Run メソッドにブレークポイントを設定します。デバッグ出力は、System.Diagnostics を使って記述します。
C++ の場合、Run 関数にブレークポイントを設定します。デバッグ出力は、OutputDebugString を使って記述します。
JavaScript の場合、バックグラウンド タスクの JavaScript ファイルにブレークポイントを設定します。デバッグ出力は、debug object を使って記述します。
[デバッグの場所] ツール バーにある [中断] ドロップ ダウン メニューを使ってバックグラウンド タスクをトリガーします。このドロップダウンには、Visual Studio でアクティブ化できるバックグラウンド タスクの名前が表示されます。
この機能を使うには、バックグラウンド タスクが既に登録されていて、トリガーを待機する状態になっていることが必要です。たとえば、1 回限りの TimeTrigger に対してバックグラウンド タスクを登録した場合、そのトリガーが起動された後に Visual Studio からそのタスクを起動しても何も起こりません。
注 ControlChannelTrigger (または PushNotificationTrigger) を使ったバックグラウンド タスクや、トリガーの種類が SmsReceived である SystemTrigger を使ったバックグラウンド タスクをこの方法でアクティブ化することはできません。
バックグラウンド タスクがアクティブになると、デバッガーがアタッチされて、デバッグ出力が VS に表示されます。
バックグラウンド タスクのアクティブ化のデバッグ
バックグラウンド タスクをアクティブ化するには、3 つのものを正しく一致させる必要があります。この手順では、これらがすべて一致しているかをチェックし、確実に一致させる方法を示します。
- バックグラウンド タスク クラスの名前と名前空間 (Javascript の場合はタスクのパスとファイル名)
- パッケージ マニフェストに指定されたエントリ ポイント属性 (Javascript の場合は開始ページ属性)
- バックグラウンド タスクの登録時にアプリによって指定されたエントリ ポイント
Visual Studio を使い、バックグラウンド タスクのエントリ ポイントを確認します。
- C# と C++ の場合、バックグラウンド タスク プロジェクトで指定されたバックグラウンド タスク クラスの名前と名前空間を確認します。
- JavaScript の場合、バックグラウンド タスク ファイルのパスとファイル名を確認します。
マニフェスト デザイナーを使い、バックグラウンド タスクがパッケージ マニフェストで正しく宣言されているかどうかを確認します。
- C# と C++ の場合、エントリ ポイント属性が、クラス名の前のバックグラウンド タスク名前空間と一致している必要があります。たとえば、Tasks.MyBackgroundTask のようになります。
- JavaScript の場合、開始ページ属性が、バックグラウンド タスク ワーカーの JavaScript ファイルのパスである必要があります。たとえば、js\MyBackgroundTask.js のようになります。
- タスクと共に使われるトリガー タイプがすべて指定されている必要があります。
- ControlChannelTrigger または PushNotificationTrigger を使う場合以外、実行可能ファイルを指定しないでください。
Windows のみ。バックグラウンド タスクをアクティブ化するために Windows で使われるエントリ ポイントを確認するには、enable debug tracingにして Windows イベント ログを使います。
この手順を実行し、その結果イベント ログにバックグラウンド タスクの間違ったエントリ ポイントまたはトリガーが表示される場合は、アプリにバックグラウンド タスクが正しく登録されていません。このタスクのヘルプが必要な場合は、「バックグラウンド タスクを登録する方法」をご覧ください。
- スタート画面に移動して eventvwr.exe を検索し、イベント ビューアーを開きます。
- イベント ビューアーで [アプリケーションとサービス ログ]、[Microsoft]、[Windows]、[BackgroundTaskInfrastructure] の順に展開します。
- 操作ウィンドウで、[表示]、[分析およびデバッグ ログの表示] の順にクリックして、診断ログを有効にします。
- 診断ログを選び、[ログの有効化] をクリックします。
- 次に、アプリを使ってバックグラウンド タスクの登録とアクティブ化をもう一度試します。
- 診断ログで、詳しいエラー情報を確認します。このログには、バックグラウンド タスクに登録されたエントリ ポイントが含まれます。
バックグラウンド タスクと Visual Studio パッケージの展開
バックグラウンド タスクを使ったアプリが Visual Studio を使って展開され、その後、マニフェスト デザイナーで指定されたバージョン (メジャー バージョンとマイナー バージョン、またはそのどちらか一方) が更新された場合、以後、Visual Studio を使ってそのアプリを再展開すると、アプリのバックグラウンド タスクが停止することがあります。これは、次のようにして対処できます。
- 更新したアプリを (Visual Studio ではなく) Windows PowerShell を使って展開します。パッケージと一緒に生成されるスクリプトを実行してください。
- 既に Visual Studio でアプリを展開したことによってアプリのバックグラウンド タスクが停止している場合は、再起動するか、いったんログオフしてからログインし直し、アプリのバックグラウンド タスクをもう一度作動させます。
- C# プロジェクトでは、"パッケージを常に再インストール" というデバッグ オプションを選ぶことで、この問題を回避することができます。
- 展開用にアプリが最終確定するのを待ってパッケージのバージョンをインクリメントします (デバッグ中は変更しない)。
注釈
バックグラウンド タスクをデバッグする際は、次の点にも注意してください。
- JavaScript のバックグラウンド タスクは、完了時に close() を呼び出す必要があります。バックグラウンド タスクから close() が呼び出されなかった場合、そのタスク プロセスが実行されたままになります。この結果、バッテリの駆動時間が無駄に消費されるばかりか、予期しない動作を引き起こすこともあります。
- バックグラウンド タスクは、同じバックグラウンド タスクが登録されていないことをアプリ側で必ずチェックしたうえで登録してください。同じバックグラウンド タスクを重複して登録すると、1 回のトリガーにつきバックグラウンド タスクが複数回実行され、予期しない結果を招きます。このタスクのヘルプが必要な場合は、「保留中のバックグラウンド タスクのリストを取得する方法」をご覧ください。
- バックグラウンド タスクがロック画面へのアクセスを必要とする場合は、バックグラウンド タスクをデバッグする前にロック画面にアプリを配置してください。ロック画面対応アプリのマニフェスト オプションを指定する方法については、「ロック画面で通知を表示する方法」および「アプリケーション マニフェストでバックグラウンド タスクを宣言する方法」をご覧ください。
- Windows 8.1 以降では、バックグラウンド タスクの登録パラメーターが登録時に検証されます。いずれかの登録パラメーターが有効でない場合は、エラーが返されます。バックグラウンド タスクの登録が失敗するシナリオをアプリが適切に処理するようにします。タスクを登録しようとした後で、有効な登録オブジェクトを持っていることを前提として動作するアプリは、クラッシュする場合があります。たとえば、アプリで条件ステートメントを使って登録エラーを確認し、失敗した登録は別のパラメーター値を使ってやり直してみます。
VS を使ってバックグラウンド タスクをデバッグする方法について詳しくは、「Windows ストア アプリで一時停止イベント、再開イベント、バックグラウンド イベントをトリガーする方法」をご覧ください。
関連トピック
アプリケーション マニフェストでバックグラウンド タスクを宣言する方法