Bagikan melalui


0x9F Pemeriksaan Bug: DRIVER_POWER_STATE_FAILURE

Pemeriksaan bug DRIVER_POWER_STATE_FAILURE memiliki nilai 0x0000009F. Pemeriksaan bug ini menunjukkan bahwa driver dalam status daya yang tidak konsisten atau tidak valid.

Penting

Artikel ini untuk programmer. Jika Anda adalah pelanggan yang telah menerima kode kesalahan layar biru saat menggunakan komputer Anda, lihat Memecahkan masalah kesalahan layar biru.

Parameter DRIVER_POWER_STATE_FAILURE

Parameter 1 menunjukkan jenis pelanggaran.

Parameter 1 Parameter 2 Parameter 3 Parameter 4 Penyebab
0x1 Objek perangkat Telah dipesan Telah dipesan Objek perangkat yang sedang dibebaskan masih memiliki permintaan daya yang luar biasa yang belum selesai.
0x2 Objek perangkat perangkat target, jika tersedia Objek perangkat Objek pengandar, jika tersedia Objek perangkat menyelesaikan paket permintaan I/O (IRP) untuk permintaan status daya sistem, tetapi tidak memanggil PoStartNextPowerIrp.
0x3 Objek perangkat fisik (PDO) dari tumpukan nt!_TRIAGE_9F_POWER. IRP yang diblokir Objek perangkat telah memblokir IRP terlalu lama.
0x4 Nilai waktu habis, dalam detik. Utas saat ini memegang kunci Plug-and-Play (PnP). Nt! TRIAGE_9F_PNP. Waktu transisi status daya habis menunggu untuk disinkronkan dengan subsistem PnP.
0x5 Objek Perangkat Fisik tumpukan Objek POP_FX_DEVICE Dicadangkan - 0 Perangkat gagal menyelesaikan transisi daya yang diarahkan dalam jumlah waktu yang diperlukan.
0x6 Objek POP_FX_DEVICE Menunjukkan apakah ini adalah Penyelesaian Power Down(1) atau Power Up(0) yang Diarahkan. Dicadangkan - 0 Perangkat tidak berhasil menyelesaikan panggilan balik Transisi Daya Terarahnya.
0x500 Dicadangkan Objek perangkat perangkat target, jika tersedia Objek perangkat Objek perangkat menyelesaikan IRP untuk permintaan status daya sistem, tetapi tidak memanggil PoStartNextPowerIrp.

Penyebab

Untuk deskripsi kemungkinan penyebabnya, lihat deskripsi setiap kode di bagian Parameter. Penyebab umumnya meliputi:

  • Objek perangkat dibebaskan dengan permintaan daya yang belum selesai
  • Waktu transisi status daya habis
  • Objek perangkat memblokir IRP
  • Menyelesaikan IRP tetapi tidak memanggil PoStartNextPowerIrp

Resolusi

Untuk menentukan penyebab spesifik dan untuk membuat perbaikan kode, pengalaman pemrograman dan akses ke kode sumber modul yang rusak diperlukan.

Penelusuran kesalahan pemeriksaan bug 0x9F ketika Parameter 1 sama dengan 0x3

  • Dalam debugger kernel, gunakan perintah !analyze -v untuk melakukan analisis pemeriksaan bug awal. Analisis verbose menampilkan alamat nt! TRIAGE_9F_POWER struktur, yang ada di Arg3.
kd>!analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

    DRIVER_POWER_STATE_FAILURE (9f)
    A driver has failed to complete a power IRP within a specific time.
    Arguments:
    Arg1: 0000000000000003, A device object has been blocking an Irp for too long a time
    Arg2: fffffa8007b13440, Physical Device Object of the stack
    Arg3: fffff8000386c3d8, nt!_TRIAGE_9F_POWER on Win7 and higher, otherwise the Functional Device Object of the stack
    Arg4: fffffa800ab61bd0, The blocked IRP

Jika driver yang bertanggung jawab atas kesalahan dapat diidentifikasi, namanya dicetak di layar biru dan disimpan dalam memori di lokasi (PUNICODE_STRING) KiBugCheckDriver. Anda dapat menggunakan dx (ekspresi model objek debugger tampilan), perintah debugger, untuk menampilkan ini: dx KiBugCheckDriver.

Nt! TRIAGE_9F_POWER struktur menyediakan informasi pemeriksaan bug tambahan yang mungkin membantu Anda menentukan penyebab pemeriksaan bug ini. Struktur dapat menyediakan daftar semua runtime integrasi daya yang luar biasa, daftar semua utas pekerja IRP daya, dan penunjuk ke antrean pekerja sistem yang tertunda.

  • Gunakan perintah dt (Jenis Tampilan) dan tentukan nt! TRIAGE_9F_POWER struktur menggunakan alamat dari Arg3.
    0: kd> dt nt!_TRIAGE_9F_POWER fffff8000386c3d8
       +0x000 Signature        : 0x8000
       +0x002 Revision         : 1
       +0x008 IrpList          : 0xfffff800`01c78bd0 _LIST_ENTRY [ 0xfffffa80`09f43620 - 0xfffffa80`0ad00170 ]
       +0x010 ThreadList       : 0xfffff800`01c78520 _LIST_ENTRY [ 0xfffff880`009cdb98 - 0xfffff880`181f2b98 ]
       +0x018 DelayedWorkQueue : 0xfffff800`01c6d2d8 _TRIAGE_EX_WORK_QUEUE

Perintah dt (Jenis Tampilan) menampilkan struktur. Anda dapat menggunakan berbagai perintah debugger untuk mengikuti bidang LIST_ENTRY untuk memeriksa daftar IRP yang luar biasa dan utas pekerja IRP daya.

  • Gunakan perintah !irp untuk memeriksa IRP yang diblokir. Alamat IRP ini ada di Arg4.
    0: kd> !irp fffffa800ab61bd0
    Irp is active with 7 stacks 6 is current (= 0xfffffa800ab61e08)
     No Mdl: No System Buffer: Thread 00000000:  Irp stack trace.  
         cmd  flg cl Device   File     Completion-Context
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-00000000    

                Args: 00000000 00000000 00000000 00000000
    >[IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
                0 e1 fffffa800783f060 00000000 00000000-00000000    pending
               \Driver\HidUsb
                Args: 00016600 00000001 00000004 00000006
     [N/A(0), N/A(0)]
                0  0 00000000 00000000 00000000-fffffa800ad00170    

                Args: 00000000 00000000 00000000 00000000
  • Gunakan perintah !devstack dengan alamat PDO di Arg2, untuk menampilkan informasi yang terkait dengan driver yang rusak.
    0: kd> !devstack fffffa8007b13440
      !DevObj           !DrvObj            !DevExt           ObjectName
      fffffa800783f060  \Driver\HidUsb     fffffa800783f1b0  InfoMask field not found for _OBJECT_HEADER at fffffa800783f030

    > fffffa8007b13440  \Driver\usbhub     fffffa8007b13590  Cannot read info offset from nt!ObpInfoMaskToOffset

    !DevNode fffffa8007ac8a00 :
      DeviceInst is "USB\VID_04D8&PID_0033\5&46fa7b7&0&1"
      ServiceName is "HidUsb"
  • Gunakan perintah !poaction untuk menampilkan utas yang menangani operasi daya dan runtime integrasi daya yang dialokasikan.
    3: kd> !poaction
    PopAction: fffff801332f3fe0
      State..........: 0 - Idle
      Updates........: 0 
      Action.........: None
      Lightest State.: Unspecified
      Flags..........: 10000003 QueryApps|UIAllowed
      Irp minor......: ??
      System State...: Unspecified
      Hiber Context..: 0000000000000000

    Allocated power irps (PopIrpList - fffff801332f44f0)
      IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060
      IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050
      IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040
      IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060
      IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060
      IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050

    Irp worker threads (PopIrpThreadList - fffff801332f3100)
      THREAD: ffffe0000ef5d040 (static)
      THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040

    PopAction: fffff801332f3fe0
      State..........: 0 - Idle
      Updates........: 0 
      Action.........: None
      Lightest State.: Unspecified
      Flags..........: 10000003 QueryApps|UIAllowed
      Irp minor......: ??
      System State...: Unspecified
      Hiber Context..: 0000000000000000

    Allocated power irps (PopIrpList - fffff801332f44f0)
      IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060
      IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050
      IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040
      IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060
      IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060
      IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050

    Irp worker threads (PopIrpThreadList - fffff801332f3100)
      THREAD: ffffe0000ef5d040 (static)
      THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040
  • Jika Anda bekerja dengan driver KMDF, gunakan Windows Driver Framework Extensions (!wdfkd) untuk mengumpulkan informasi tambahan.

    Gunakan !wdfkd.wdflogdump<nama> driver Anda, untuk melihat apakah KMDF menunggu Anda untuk ACK permintaan yang tertunda.

    Gunakan !wdfkd.wdfdevicequeues<WDFDEVICE> Anda untuk memeriksa semua permintaan yang luar biasa dan statusnya.

  • Gunakan ekstensi !stacks untuk memeriksa status setiap utas dan cari utas yang mungkin menahan transisi status daya.

  • Untuk membantu Anda menentukan penyebab kesalahan, pertimbangkan pertanyaan berikut:

    • Apa karakteristik driver objek perangkat fisik (PDO) (Arg2)?
    • Dapatkah Anda menemukan utas yang diblokir? Ketika Anda memeriksa utas dengan perintah debugger !thread , apa yang terdiri dari utas?
    • Apakah ada IO yang terkait dengan utas yang memblokirnya? Simbol apa yang ada di tumpukan?
    • Ketika Anda memeriksa IRP daya yang diblokir, apa yang Anda perhatikan?
    • Apa kode fungsi minor PnP dari power IRP?

Penelusuran kesalahan pemeriksaan bug 0x9F saat Parameter 1 sama dengan 0x4

  • Dalam debugger kernel, gunakan perintah !analyze -v untuk melakukan analisis pemeriksaan bug awal. Analisis verbose menampilkan alamat nt! TRIAGE_9F_PNP struktur, yang ada di Parameter 4 (arg4).
    kd> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Bugcheck Analysis                                    *
    *                                                                             *
    *******************************************************************************

    DRIVER_POWER_STATE_FAILURE (9f)
    A driver has failed to complete a power IRP within a specific time (usually 10 minutes).
    Arguments:
    Arg1: 00000004, The power transition timed out waiting to synchronize with the Pnp
            subsystem.
    Arg2: 00000258, Timeout in seconds.
    Arg3: 84e01a70, The thread currently holding on to the Pnp lock.
    Arg4: 82931b24, nt!TRIAGE_9F_PNP on Win7

Nt! TRIAGE_9F_PNP struktur menyediakan informasi pemeriksaan bug tambahan yang mungkin membantu Anda menentukan penyebab kesalahan. Nt! TRIAGE_9F_PNP struktur menyediakan pointer ke struktur yang berisi daftar IRP PnP yang dikirim (tetapi tidak selesai) dan menyediakan pointer ke antrean pekerja sistem yang tertunda.

  • Gunakan perintah dt (Jenis Tampilan) dan tentukan nt! TRIAGE_9F_PNP struktur dan alamat yang Anda temukan di Arg4.
    kd> dt nt!TRIAGE_9F_PNP 82931b24
       +0x000 Signature        : 0x8001
       +0x002 Revision         : 1
       +0x004 CompletionQueue  : 0x82970e20 _TRIAGE_PNP_DEVICE_COMPLETION_QUEUE
       +0x008 DelayedWorkQueue : 0x829455bc _TRIAGE_EX_WORK_QUEUE

Perintah dt (Jenis Tampilan) menampilkan struktur. Anda dapat menggunakan perintah debugger untuk mengikuti bidang LIST_ENTRY untuk memeriksa daftar IRP PnP yang luar biasa.

Untuk membantu Anda menentukan penyebab kesalahan, pertimbangkan pertanyaan berikut:

  • Apakah ada IRP yang terkait dengan utas?

  • Apakah ada IO dalam CompletionQueue?

  • Simbol apa yang ada di tumpukan?

  • Lihat teknik tambahan yang dijelaskan di atas di bawah parameter 0x3.

Keterangan

Jika Anda tidak dilengkapi untuk men-debug masalah ini menggunakan teknik yang dijelaskan di atas, Anda dapat menggunakan beberapa teknik pemecahan masalah dasar.

  • Jika driver atau layanan sistem baru perangkat telah ditambahkan baru-baru ini, coba hapus atau perbarui. Cobalah untuk menentukan apa yang berubah dalam sistem yang menyebabkan kode pemeriksaan bug baru muncul.

  • Lihat di Manajer Perangkat untuk melihat apakah ada perangkat yang ditandai dengan tanda seru (!). Tinjau log peristiwa yang ditampilkan di properti driver untuk driver yang rusak. Cobalah memperbarui driver terkait.

  • Periksa Pemantau Peristiwa Masuk Sistem untuk pesan kesalahan tambahan yang mungkin membantu menentukan perangkat atau driver yang menyebabkan kesalahan. Untuk informasi selengkapnya, lihat Membuka Pemantau Peristiwa. Cari kesalahan kritis dalam log sistem yang terjadi di kurun waktu yang sama dengan layar biru.

  • Untuk mencoba dan mengisolasi penyebabnya, nonaktifkan penghematan daya secara sementara menggunakan panel kontrol, opsi daya. Beberapa masalah driver terkait dengan berbagai status hibernasi sistem dan penangguhan dan dimulainya kembali daya.

  • Jika Anda baru saja menambahkan perangkat keras ke sistem, coba hapus atau menggantinya. Atau periksa dengan produsen untuk melihat apakah ada patch yang tersedia.

  • Anda dapat mencoba menjalankan diagnostik perangkat keras yang disediakan oleh produsen sistem.

  • Tanyakan kepada produsen untuk melihat apakah sistem ACPI/BIOS yang diperbarui atau firmware lainnya tersedia.

Lihat juga

Analisis crash dump menggunakan debugger Windows (WinDbg)

Menganalisis File Cadangan Kernel-Mode dengan WinDbg

Referensi Bug Check Code