ETW イベントを使用した USB デバイスの問題のデバッグ

このトピックでは、ETW イベントを使用して USB デバイスの問題をデバッグするためのヒントを提供します。

デバイス列挙エラーの診断

USB ハブ列挙タスクに関連付けられている ETW イベントを使用して、ほとんどのデバイス列挙エラーの根本原因を特定できます。

USB ハブ列挙タスクに関連付けられているトレース ログ内のイベントを表示するには

  1. Netmon を開き、"Start Enumeration of Port" (ポートの列挙の開始) などの列挙イベントを見つけます。 [フレームの概要] ペインでイベントをクリックします。

  2. イベントの [タスク] フィールドを調べて、このイベントに対応するタスクが USB ハブ列挙であることを確認します。

    1. [フレームの詳細] ペインで、[Net イベント][ヘッダー][記述子] の順に展開して、[タスク] フィールドを見つけます。
    2. [タスク] フィールドに値 2 (USB ハブ列挙) が含まれていることを確認します。
  3. タスク値が 2 のハブ ドライバーからのイベントのみが表示されるように、フィルターでイベントを絞り込みます。

    1. [タスク] フィールドを右クリックします。

    2. [選択した値を表示フィルターに追加] を選択します。

    3. [フレームの概要] ペインでイベントを右クリックし、[表示フィルター] に "プロトコル名" を [追加] します。

    4. [表示フィルター] ペインで、[OR] を [AND] に変更します。 次のサンプルは、最終的なフィルターを示します。

      NetEvent.Header.Descriptor.Task == 0x2 AND ProtocolName == "USBHub_MicrosoftWindowsUSBUSBHUB"
      

      Netmon でフィルターを使用する方法の詳細については、「ケース スタディ: ETW と Netmon の使用による不明な USB デバイスのトラブルシューティング」の「USB Netmon フィルター」を参照してください。

デバイスの起動エラーの診断

デバイスの開始 I/O 要求パケット (IRP) をハブ ドライバーで処理する際にデバイスが起動に失敗した場合は、USB デバイスの開始タスクに関連付けられた ETW イベントを使用して、エラーのトラブルシューティングを行うことができます。 Netmon で、"USB Device Start IRP Dispatched" (USB デバイス開始 IRP ディスパッチ済み) などのデバイス開始イベントを見つけます。 イベントをフィルター処理して、ハブ ドライバーからのイベントで、タスク値が 21 (USB デバイスの開始) のものだけを表示することができます。 このようなフィルターの作成方法については、このトピックの「デバイス列挙エラーの診断」を参照してください。

デバイスの挿入タイミングのプロファイリング

列挙イベントのタイムスタンプを調べることで、ハブ ドライバーでデバイスの挿入中に時間がかかっている箇所を確認できます。

列挙のタイミング

デバイス挿入時間のうち、ハブ ドライバーがデバイスを列挙するために消費した時間は、次の 2 つのイベントの間の経過時間です。

  • Start Enumeration of Port (ポートの列挙の開始)
  • Enumeration of Port Completed (ポートの列挙の完了)

列挙タスクのプロファイリング

USB ハブ ドライバーがデバイスを列挙する際には、以下のイベントがこの順序でログに記録されます。

  • Start Enumeration of Port (ポートの列挙の開始)
  • Enumeration Debounce Completed (列挙デバウンスの完了)
  • PDO Created for Enumeration (列挙用に PDO を作成完了)
  • First Enumeration Port Reset Complete (1 つ目の列挙ポートのリセット完了)
  • Enumeration - CreateDevice Complete (列挙 - CreateDevice 完了)
  • Second Enumeration Port Reset Complete (2 つ目の列挙ポートのリセット完了)
  • Enumeration - InitializeDevice Complete (列挙 - InitializeDevice 完了)
  • Enumeration - SetupDevice Complete (列挙 - SetupDevice 完了)
  • Enumeration of Port Completed (ポートの列挙の完了)

各列挙タスクでハブ ドライバーが消費した時間を確認するには、上記のイベント間の経過時間を計算します。 IoInvalidateDeviceRelations から IRP_MN_QUERY_DEVICE_RELATIONS までの経過時間

システムが消費したデバイス挿入時間のうち、システムがクエリ デバイスの関係 IRP を待機している間にかかった時間を特定するには、次の 2 つのイベント間の経過時間を測定します。

  • Enumeration of Port Completed (ポートの列挙の完了)
  • USB Hub Query Device Relations (BusRelations) IRP Dispatched (USB ハブ クエリ デバイス関係 (BusRelations) IRP ディスパッチ済み)

IRP_MN_QUERY_DEVICE_RELATIONS の完了から IRP_MN_START_DEVICE までの経過時間

デバイス挿入時間のうち、新しい物理デバイス オブジェクト (PDO) をプラグ アンド プレイ マネージャーに報告してから開始 IRP を受信するまでの時間を特定するには、次の 2 つのイベント間の経過時間を測定します。

  • USB Hub Query Device Relations IRP Completed (USB ハブ クエリ デバイス関係 IRP 完了)
  • USB Device Start IRP Dispatched (USB デバイス開始 IRP ディスパッチ済み)

開始 IRP のタイミング

ハブ ドライバーが開始 IRP を処理するために消費した時間を判断するには、次の 2 つのイベント間の経過時間を測定します。

  • USB Device Start IRP Dispatched (USB デバイス開始 IRP ディスパッチ済み)
  • USB Device Start IRP Completed (USB デバイス開始 IRP 完了)

ソフトウェアによって開始されるデバイス再開のタイミング

デバイスのファンクション ドライバーは、D0 デバイス電力要求を送信して、デバイスをサスペンド状態から再開できます。 デバイスがサスペンド状態から再開し、転送要求の準備が整うために必要とした時間を特定するには、次の 2 つのイベント間の経過時間を測定します。

  • USB Device Set D0 Device Power IRP Dispatched (USB デバイス セット D0 デバイス電力 IRP ディスパッチ済み)
  • USB Device Set D0 Device Power IRP Completed (USB デバイス セット D0 デバイス電力 IRP 完了)

ハードウェアによって開始されるデバイス再開のタイミング

バス上の再開信号により、デバイスがサスペンド状態から再開されます。 デバイスが再開し、転送要求の準備が整った状態になるために必要とした時間を特定するには、次の 2 つのイベント間の経過時間を測定します。

  • 親ハブがサスペンド状態でない場合:
    • USB Device Wait Wake IRP Completed (USB デバイス待機ウェイク IRP 完了)
    • USB Device Set D0 Device Power IRP Completed (USB デバイス セット D0 デバイス電力 IRP 完了)
  • 親ハブがサスペンド状態の場合:
    • Started Resume of Hub from Selective Suspend (選択的サスペンドからのハブ再開の開始) (デバイスとホスト コントローラーの間のハブに対するこれらの最初のイベント)
    • USB Device Set D0 Device Power IRP Completed (USB デバイス セット D0 デバイス電力 IRP 完了)

選択的サスペンドのタイミングからのハブの再開

ハブが選択的サスペンドから再開するために必要とした時間を特定するには、次の 2 つのイベント間の経過時間を測定します。

  • Started Resume of Hub from Selective Suspend (選択的サスペンドからハブの再開を開始)
  • Resume of Hub Completed (ハブの再開を完了)

Note

ハブの再開のタイミングは、ハブの下にあるすべてのデバイスの再開タイミングと、場合によっては再開されるハブの上にある一部またはすべてのハブの再開タイミングによって異なります。