Mengontrol Utas dan Proses

Untuk gambaran umum utas dan proses di mesin debugger, lihat Utas dan Proses.

Ketika suatu peristiwa terjadi, utas peristiwa dan proses peristiwa diatur ke utas dan proses (sistem operasi atau virtual) tempat peristiwa terjadi. Mereka dapat ditemukan menggunakan GetEventThread dan GetEventProcess, masing-masing.

Utas dan Proses Implisit

Dalam mode kernel men-debug mesin debugger akan menggunakan proses implisit untuk menentukan ruang alamat virtual mana yang akan digunakan saat melakukan terjemahan alamat virtual ke fisik -- misalnya, dalam metode VirtualToPhysical dan ReadVirtual. Ketika suatu peristiwa terjadi, proses implisit diatur ke proses saat ini.

Proses implisit dapat diubah dengan menggunakan SetImplicitProcessDataOffset. Untuk menentukan proses implisit, gunakan GetImplicitProcessDataOffset.

Catatan Saat mengatur titik henti selama sesi debugging kernel langsung, mesin debugger akan meneruskan alamat virtual titik henti ke target, dan target akan mengatur titik henti. Dalam hal ini, hanya konteks proses target yang digunakan saat menangani titik henti; nilai proses implisit tidak relevan.

Dalam penelusuran kesalahan mode kernel, mesin debugger akan menggunakan utas implisit untuk menentukan beberapa register target. Ini termasuk tumpukan prosesor (lihat GetStackOffset), offset bingkai (lihat GetFrameOffset), dan offset instruksi (lihat GetInstructionOffset). Ketika suatu peristiwa terjadi, utas implisit diatur ke utas saat ini.

Utas implisit dapat diubah dengan menggunakan SetImplicitThreadDataOffset. Untuk menentukan utas implisit, gunakan GetImplicitThreadDataOffset.

Tidak semua register ditentukan oleh utas implisit. Beberapa register akan tetap sama ketika utas implisit diubah.

Peringatan Proses implisit dan utas implisit bersifat independen. Jika utas implisit bukan milik proses implisit, maka status pengguna dan sesi untuk utas implisit akan berada di ruang alamat virtual yang salah dan upaya untuk mengakses informasi ini akan menyebabkan kesalahan atau memberikan hasil yang salah. Masalah ini tidak terjadi saat mengakses memori kernel, karena alamat memori kernel konstan di semua ruang alamat virtual. Dengan demikian informasi untuk utas implisit yang terletak di memori kernel dapat diakses terlepas dari proses implisit.

Benang

ID utas mesin digunakan oleh mesin debugger untuk mengidentifikasi setiap utas sistem operasi dan setiap utas virtual untuk target.

Sementara target dihentikan, setiap utas juga memiliki indeks yang relatif terhadap proses tempatnya berada. Untuk proses apa pun, indeks utas pertama dalam proses adalah nol, dan indeks utas terakhir adalah jumlah utas dalam proses dikurangi satu. Jumlah utas dalam proses saat ini dapat ditemukan dengan menggunakan GetNumberThreads. Jumlah total utas di semua proses dalam target saat ini dapat ditemukan dengan menggunakan GetTotalNumberThreads.

ID utas mesin dan ID utas sistem untuk satu atau beberapa utas dalam proses saat ini dapat ditemukan dari indeks mereka dengan menggunakan GetThreadIdsByIndex.

Mesin mempertahankan beberapa informasi tentang setiap utas. Informasi ini dapat dikueri untuk utas saat ini, dan dapat digunakan untuk menemukan ID utas mesin untuk utas.

ID utas sistem (hanya penelusuran kesalahan mode pengguna)
ID utas sistem dari utas saat ini dapat ditemukan dengan menggunakan GetCurrentThreadSystemId. Untuk ID utas sistem tertentu, ID utas mesin yang sesuai dapat ditemukan dengan menggunakan GetThreadIdBySystemId.

blok lingkungan utas (TEB)
Alamat TEB untuk utas saat ini dapat ditemukan dengan menggunakan GetCurrentThreadTeb. Untuk alamat TEB tertentu, ID utas mesin yang sesuai dapat ditemukan dengan menggunakan GetThreadIdByTeb. Dalam penelusuran kesalahan mode kernel, TEB utas (virtual) adalah TEB utas sistem yang berjalan pada prosesor yang sesuai ketika peristiwa terakhir terjadi.

offset data
Dalam penelusuran kesalahan mode pengguna, offset data dari utas (sistem) adalah lokasi TEB untuk utas tersebut. Dalam mode kernel yang men-debug offset data dari utas (virtual) adalah struktur KTHREAD untuk utas sistem yang berjalan pada prosesor yang sesuai ketika peristiwa terakhir terjadi. Offset data dari utas saat ini dapat ditemukan dengan menggunakan GetCurrentThreadDataOffset. Untuk offset data tertentu, ID utas mesin yang sesuai dapat ditemukan dengan menggunakan GetThreadIdByDataOffset.

handel sistem
Handel sistem dari utas saat ini dapat ditemukan dengan menggunakan GetCurrentThreadHandle. Untuk handel sistem tertentu, ID utas mesin yang sesuai dapat ditemukan dengan menggunakan GetThreadIdByHandle. Dalam penelusuran kesalahan mode kernel, handel buatan dibuat untuk setiap proses (virtual). Handel ini hanya dapat digunakan dengan kueri API mesin debugger.

Proses

ID proses mesin digunakan oleh mesin debugger untuk mengidentifikasi setiap proses sistem operasi dan setiap proses virtual untuk target.

Saat target dihentikan, setiap proses memiliki indeks yang relatif terhadap target. Indeks proses pertama dalam target adalah nol, dan indeks proses terakhir adalah jumlah proses dalam target dikurangi satu. Jumlah proses dalam target saat ini dapat ditemukan dengan menggunakan GetNumberProcesses.

ID proses mesin dan ID proses sistem untuk satu atau beberapa utas dalam target saat ini dapat ditemukan dari indeks mereka dengan menggunakan GetProcessIdsByIndex.

Mesin mempertahankan beberapa informasi tentang setiap proses. Informasi ini dapat dikueri untuk proses saat ini, dan dapat digunakan untuk menemukan ID proses mesin untuk suatu proses.

ID proses sistem (hanya penelusuran kesalahan mode pengguna)
ID proses sistem dari proses saat ini dapat ditemukan dengan menggunakan GetCurrentProcessSystemId. Untuk ID proses sistem tertentu, ID proses mesin yang sesuai dapat ditemukan dengan menggunakan GetProcessIdBySystemId.

blok lingkungan proses (PEB)
Alamat PEB untuk proses saat ini dapat ditemukan dengan menggunakan GetCurrentProcessPeb. Untuk alamat PEB tertentu, ID proses mesin yang sesuai dapat ditemukan dengan menggunakan GetProcessIdByPeb. Dalam debugging mode kernel, PEB dari proses (virtual) adalah PEB dari proses sistem yang berjalan ketika peristiwa terakhir terjadi.

offset data
Dalam penelusuran kesalahan mode pengguna, offset data dari proses (sistem) adalah lokasi PEB proses tersebut. Dalam penelusuran kesalahan mode kernel, offset data dari proses (virtual) adalah struktur KPROCESS untuk proses sistem yang berjalan ketika peristiwa terakhir terjadi. Offset data dari proses saat ini dapat ditemukan dengan menggunakan GetCurrentProcessDataOffset. Untuk offset data tertentu, ID proses mesin yang sesuai dapat ditemukan dengan menggunakan GetProcessIdByDataOffset.

handel sistem
Handel sistem dari proses saat ini dapat ditemukan dengan menggunakan GetCurrentProcessHandle. Untuk handel sistem tertentu, ID proses mesin yang sesuai dapat ditemukan dengan menggunakan GetProcessIdByHandle. Dalam penelusuran kesalahan mode kernel, handel buatan dibuat untuk proses (virtual). Handel ini hanya dapat digunakan dengan kueri mesin debugger.

Kejadian

Dalam penelusuran kesalahan mode pengguna langsung, setiap kali utas dibuat atau keluar dalam target, peristiwa debugging create-thread dan exit-thread dihasilkan. Peristiwa ini menghasilkan panggilan ke metode panggilan balik IDebugEventCallbacks::CreateThread dan IDebugEventCallbacks::ExitThread callback.

Dalam penelusuran kesalahan mode pengguna langsung, setiap kali proses dibuat atau keluar dalam target, peristiwa penelusuran kesalahan proses pembuatan dan proses keluar dihasilkan. Peristiwa ini menghasilkan panggilan ke metode panggilan balik IDebugEventCallbacks::CreateProcess dan IDebugEventCallbacks::ExitProcess .

Untuk informasi selengkapnya tentang peristiwa, lihat Memantau Peristiwa.

Informasi Tambahan

Untuk informasi selengkapnya tentang utas dan proses, termasuk struktur TEB, KTHREAD, PEB, dan KPROCESS, lihat Microsoft Windows Internals oleh David Solomon dan Mark Russinovich.