Bagikan melalui


Menemukan Proses yang Gagal

Sebelum menemukan proses yang gagal, pastikan Anda berada dalam konteks prosesor penerimaan. Untuk menentukan prosesor yang menerima, gunakan ekstensi !pcr pada setiap prosesor dan cari prosesor yang penangan pengecualiannya telah dimuat. Penangan pengecualian prosesor yang menerima memiliki alamat selain 0xFFFFFFFF.

Misalnya, karena alamat NtTib.ExceptionList pada prosesor ini, 0xFFFFFFFF, ini bukan prosesor dengan prosesor yang gagal:

0: kd> !pcr 
PCR Processor 0 @ffdff000
 NtTib.ExceptionList: ffffffff
            NtTib.StackBase: 80470650
           NtTib.StackLimit: 8046d860
         NtTib.SubSystemTib: 00000000
              NtTib.Version: 00000000
          NtTib.UserPointer: 00000000
              NtTib.SelfTib: 00000000

                    SelfPcr: ffdff000
                       Prcb: ffdff120
                       Irql: 00000000
                        IRR: 00000000
                        IDR: ffffffff
              InterruptMode: 00000000
                        IDT: 80036400
                        GDT: 80036000
                        TSS: 80257000

              CurrentThread: 8046c610
                 NextThread: 00000000
                 IdleThread: 8046c610

                  DpcQueue: 

Namun, hasil untuk Prosesor 1 cukup berbeda. Dalam hal ini, nilai NtTib.ExceptionList adalah f0823cc0, bukan 0xFFFFFFFF, menunjukkan bahwa ini adalah prosesor tempat pengecualian terjadi.

0: kd> ~1 
1: kd> !pcr
PCR Processor 1 @81497000
 NtTib.ExceptionList: f0823cc0
            NtTib.StackBase: f0823df0
           NtTib.StackLimit: f0821000
         NtTib.SubSystemTib: 00000000
              NtTib.Version: 00000000
          NtTib.UserPointer: 00000000
              NtTib.SelfTib: 00000000

                    SelfPcr: 81497000
                       Prcb: 81497120
                       Irql: 00000000
 IRR: 00000000
                        IDR: ffffffff
              InterruptMode: 00000000
                        IDT: 8149b0e8
 GDT: 8149b908
                        TSS: 81498000

              CurrentThread: 81496d28
                 NextThread: 00000000
                 IdleThread: 81496d28

                  DpcQueue: 

Ketika Anda berada dalam konteks prosesor yang benar, ekstensi !process menampilkan proses yang sedang berjalan.

Bagian paling menarik dari dump proses adalah:

  • Waktu (nilai tinggi menunjukkan bahwa proses mungkin pelakunya).

  • Jumlah handel (ini adalah angka dalam tanda kurung setelah ObjectTable di entri pertama).

  • Status utas (banyak proses memiliki beberapa utas). Jika proses saat ini menganggur, kemungkinan mesin benar-benar menganggur atau digantung karena beberapa masalah yang tidak biasa.

Meskipun menggunakan ekstensi !process 0 7 adalah cara terbaik untuk menemukan masalah pada sistem gantung, terkadang terlalu banyak informasi untuk difilter. Sebagai gantinya, gunakan !process 0 0 dan kemudian !process pada handel proses untuk CSRSS dan proses mencurigakan lainnya.

Saat menggunakan !process 0 7, banyak utas mungkin ditandai "tumpukan kernel bukan residen" karena tumpukan tersebut di-page out. Jika halaman tersebut masih dalam cache yang sedang dalam transisi, Anda bisa mendapatkan informasi lebih lanjut dengan menggunakan decodepte .cache sebelum !process 0 7:

kd> .cache decodeptes 
kd> !process 0 7 

Jika Anda dapat mengidentifikasi proses yang gagal, gunakan !process <process> 7 untuk menampilkan tumpukan kernel untuk setiap utas dalam proses. Output ini dapat mengidentifikasi masalah dalam mode kernel dan mengungkapkan apa yang dipanggil proses tersangka.

Selain !process, ekstensi berikut dapat membantu menentukan penyebab komputer yang tidak responsif:

Ekstensi Efek

!siap

Mengidentifikasi utas yang siap dijalankan, dalam urutan prioritas.

!kdext*.locks

Mengidentifikasi kunci sumber daya yang ditahan, jika ada kebuntuan dengan waktu ritel habis.

!Vm

Memeriksa penggunaan memori virtual.

!poolused

Menentukan apakah satu jenis alokasi kumpulan tidak proporsional besar (diperlukan penandaan kumpulan).

!memusage

Memeriksa status memori fisik.

!tumpukan

Memeriksa validitas timbunan.

!irpfind

Mencari kumpulan yang tidak dipagasi untuk IRP aktif.

Jika informasi yang diberikan tidak menunjukkan kondisi yang tidak biasa, coba atur titik henti di ntoskrnl! KiSwapThread untuk menentukan apakah prosesor terjebak dalam satu proses atau apakah proses tersebut masih menjadwalkan proses lain. Jika tidak macet, atur titik henti dalam fungsi umum, seperti NtReadFile, untuk menentukan apakah komputer terjebak dalam jalur kode tertentu.