Bagikan melalui


.thread (Atur Konteks Daftar)

Perintah .thread menentukan utas mana yang akan digunakan untuk konteks register.

.thread [/p [/r] ] [/P] [/w] [Thread]

Parameter

/p
(Hanya penelusuran kesalahan langsung) Jika opsi ini disertakan dan Utas bukan nol, semua entri tabel halaman transisi (PTEs) untuk proses yang memiliki utas ini akan secara otomatis diterjemahkan ke alamat fisik sebelum akses. Ini dapat menyebabkan perlambatan, karena debugger harus mencari alamat fisik untuk semua memori yang digunakan oleh proses ini, dan sejumlah besar data mungkin perlu ditransfer di seluruh kabel debug. (Perilaku ini sama dengan . cache forcedecodeuser.)

Jika opsi /p disertakan dan Utas nol atau dihilangkan, terjemahan ini akan dinonaktifkan. (Perilaku ini sama dengan . cache noforcedecodeuser.)

/r
(Hanya penelusuran kesalahan langsung) Jika opsi /r disertakan bersama dengan opsi /p , simbol mode pengguna untuk proses yang memiliki utas ini akan dimuat ulang setelah proses dan konteks pendaftaran telah ditetapkan. (Perilaku ini sama dengan . muat ulang /user.)

/P
(Hanya penelusuran kesalahan langsung) Jika opsi ini disertakan dan Utas bukan nol, semua entri tabel halaman transisi (PTEs) akan secara otomatis diterjemahkan ke dalam alamat fisik sebelum akses. Tidak seperti opsi /p, ini menerjemahkan PTEs untuk semua proses mode pengguna dan mode kernel, tidak hanya proses yang memiliki utas ini. Ini dapat menyebabkan perlambatan, karena debugger harus mencari alamat fisik untuk semua memori yang digunakan, dan sejumlah besar data mungkin perlu ditransfer di seluruh kabel debug. (Perilaku ini sama dengan . cache forcedecodeptes.)

/w
(hanya debugging kernel 64-bit) Mengubah konteks aktif untuk utas ke konteks WOW64 32-bit. Utas yang ditentukan harus berjalan dalam proses yang memiliki status WOW64.

Benang
Alamat utas. Jika ini dihilangkan atau nol, konteks utas diatur ulang ke utas saat ini.

Lingkungan

Item Deskripsi
Mode mode kernel saja
Target live, crash dump
Platform all

Informasi Tambahan

Untuk informasi selengkapnya tentang konteks pendaftaran dan pengaturan konteks lainnya, lihat Mengubah Konteks.

Keterangan

Umumnya, ketika Anda melakukan penelusuran kesalahan kernel, satu-satunya register yang terlihat adalah yang terkait dengan utas saat ini.

Perintah .thread menginstruksikan debugger kernel untuk menggunakan utas yang ditentukan sebagai konteks register. Setelah perintah ini dijalankan, debugger akan memiliki akses ke register yang paling penting dan jejak tumpukan untuk utas ini. Konteks register ini bertahan hingga Anda mengizinkan target untuk menjalankan atau menggunakan perintah konteks register lain (.thread, .cxr, atau .trap). Lihat Mendaftarkan Konteks untuk detail selengkapnya.

Opsi /w hanya dapat digunakan dalam sesi debugging kernel 64-bit pada utas yang berjalan dalam proses yang memiliki status WOW64. Konteks yang diambil akan menjadi konteks terakhir yang diingat oleh WOW64; ini biasanya merupakan kode mode pengguna terakhir yang dijalankan oleh Thread. Opsi ini hanya dapat digunakan jika target berada dalam mode komputer asli. Misalnya, jika target berjalan pada komputer 64-bit yang meniru prosesor berbasis x86 menggunakan WOW64, opsi ini tidak dapat digunakan. Menggunakan opsi /w akan menyebabkan mode komputer beralih secara otomatis ke prosesor berbasis x86.

Perintah ini tidak benar-benar mengubah utas saat ini. Dengan kata lain, ekstensi seperti !thread dan !teb masih akan default ke utas saat ini jika tidak ada argumen yang digunakan dengannya.

Berikut adalah contohnya. Gunakan ekstensi !process untuk menemukan alamat utas yang diinginkan. (Dalam hal ini, !process 0 0 digunakan untuk mencantumkan semua proses, maka !process digunakan untuk kedua kalinya untuk mencantumkan semua utas untuk proses yang diinginkan.)

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529a88  TableSize: 145.
    Image: System

.....

PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe

kd> !process ffaa5280
PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe
    VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
    DeviceMap fe502e88
    Token                             e1b55d70

.....

        THREAD ffaa43a0  Cid 120.3a4  Teb: 7ffde000  Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
            ffadc6a0  SynchronizationEvent
        Not impersonating
        Owning Process ffaa5280
        WaitTime (seconds)      24323
        Context Switch Count    494                   LargeStack

.....

Sekarang gunakan perintah .thread dengan alamat utas yang diinginkan. Ini mengatur konteks register dan memungkinkan Anda untuk memeriksa register penting dan tumpukan panggilan untuk utas ini.

kd> .thread ffaa43a0
Using context of thread ffaa43a0

kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0         nv up di pl nz na pe nc
cs=0000  ss=0000  ds=0000  es=0000  fs=0000  gs=0000             efl=00000000
0000:3a0d ??              ???

kd> k
  *** Stack trace for last set context - .thread resets it
ChildEBP RetAddr  
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1