Mengubah Konteks

Dalam penelusuran kesalahan mode kernel, ada banyak proses, utas, dan terkadang sesi pengguna yang dijalankan secara bersamaan. Therfore, frasa seperti "alamat virtual 0x80002000" atau " register eax " ambigu. Anda harus menentukan konteks di mana frasa tersebut dapat dipahami.

Debugger memiliki lima konteks berbeda yang dapat Anda atur saat Anda melakukan penelusuran kesalahan:

  1. Konteks sesi menunjukkan sesi pengguna default.

  2. Konteks proses menentukan bagaimana debugger menginterpretasikan alamat virtual.

  3. Konteks alamat mode pengguna hampir tidak pernah diatur secara langsung. Konteks ini secara otomatis diatur saat Anda mengubah konteks proses.

  4. Konteks register menentukan bagaimana debugger menafsirkan register dan juga mengontrol hasil pelacakan tumpukan. Konteks ini juga dikenal sebagai konteks utas, meskipun istilah tersebut tidak sepenuhnya akurat. Konteks eksplisit juga merupakan jenis konteks register. Jika Anda menentukan konteks eksplisit, konteks tersebut digunakan alih-alih konteks register saat ini.

  5. Konteks lokal menentukan bagaimana debugger menginterpretasikan variabel lokal. Konteks ini juga dikenal sebagai cakupan.

Konteks Sesi

Beberapa sesi masuk dapat berjalan secara bersamaan. Setiap sesi masuk memiliki prosesnya sendiri.

Ekstensi !session menampilkan semua sesi masuk atau mengubah konteks sesi saat ini.

Konteks sesi digunakan oleh ekstensi !sprocess dan !spoolused ketika nomor sesi dimasukkan sebagai "-2".

Ketika konteks sesi diubah, konteks proses secara otomatis diubah ke proses aktif untuk sesi tersebut.

Konteks Proses

Setiap proses memiliki direktori halaman sendiri yang merekam bagaimana alamat virtual dipetakan ke alamat fisik. Ketika setiap utas dalam proses dijalankan, sistem operasi Windows menggunakan direktori halaman ini untuk menginterpretasikan alamat virtual.

Selama penelusuran kesalahan mode pengguna, proses saat ini menentukan konteks proses. Alamat virtual yang digunakan dalam perintah debugger, ekstensi, dan jendela informasi penelusuran kesalahan ditafsirkan dengan menggunakan direktori halaman dari proses saat ini.

Selama penelusuran kesalahan mode kernel, Anda dapat mengatur konteks proses dengan menggunakan perintah .process (Set Process Context). Gunakan perintah ini untuk memilih direktori halaman proses mana yang digunakan untuk menginterpretasikan alamat virtual. Setelah mengatur konteks proses, Anda dapat menggunakan konteks ini dalam perintah apa pun yang mengambil alamat. Anda bahkan dapat mengatur titik henti di alamat ini. Dengan menyertakan opsi /i dalam perintah .process untuk menentukan penelusuran kesalahan invasif, Anda juga dapat menggunakan debugger kernel untuk mengatur titik henti di ruang pengguna.

Anda juga dapat mengatur titik henti mode pengguna dari debugger kernel dengan menggunakan titik henti khusus proses pada fungsi ruang kernel. Atur titik henti strategis dan tunggu konteks yang sesuai muncul.

Konteks alamat mode pengguna adalah bagian dari konteks proses. Biasanya, Anda tidak perlu mengatur konteks alamat mode pengguna secara langsung. Jika Anda mengatur konteks proses, konteks alamat mode pengguna secara otomatis berubah ke basis direktori tabel halaman yang relevan untuk proses tersebut.

Saat Anda mengatur konteks proses selama penelusuran kesalahan mode kernel, konteks proses tersebut dipertahankan hingga perintah .process lain mengubah konteks. Konteks alamat mode pengguna juga dipertahankan hingga perintah .process atau .context mengubahnya. Konteks ini tidak diubah ketika komputer target dijalankan, dan tidak terpengaruh oleh perubahan pada konteks register atau konteks lokal.

Daftarkan Konteks

Setiap utas memiliki nilai register sendiri. Nilai-nilai ini disimpan di CPU mendaftar ketika utas dijalankan dan disimpan dalam memori ketika utas lain dijalankan.

Selama penelusuran kesalahan mode pengguna, utas saat ini biasanya menentukan konteks register. Referensi apa pun untuk mendaftar dalam perintah debugger, ekstensi, dan jendela informasi penelusuran kesalahan ditafsirkan sesuai dengan register utas saat ini.

Anda dapat mengubah konteks register ke nilai selain utas saat ini saat Anda melakukan penelusuran kesalahan mode pengguna dengan menggunakan salah satu perintah berikut:

.cxr (Tampilkan Rekaman Konteks)

.ecxr (Tampilkan Rekaman Konteks Pengecualian)

Selama penelusuran kesalahan mode kernel, Anda dapat mengontrol konteks register dengan menggunakan berbagai perintah debugger, termasuk perintah berikut:

.thread (Atur Register Context)

.cxr (Tampilkan Rekaman Konteks)

.trap (Tampilkan Bingkai Trap)

Perintah ini tidak mengubah nilai register CPU. Sebagai gantinya, debugger mengambil konteks register yang ditentukan dari lokasinya dalam memori. Sebenarnya, debugger hanya dapat mengambil nilai register yang disimpan . (Nilai lain diatur secara dinamis dan tidak disimpan. Nilai yang disimpan cukup untuk membuat ulang pelacakan tumpukan.

Setelah konteks register diatur, konteks register baru digunakan untuk setiap perintah yang menggunakan nilai register, seperti k (Display Stack Backtrace) dan r (Registers).

Namun, ketika Anda men-debug komputer multiprosesor, beberapa perintah memungkinkan Anda menentukan prosesor. (Untuk informasi selengkapnya tentang perintah tersebut, lihat Sintaks Multiproscessor.) Jika Anda menentukan prosesor untuk perintah, perintah menggunakan konteks register utas aktif pada prosesor yang ditentukan alih-alih konteks register saat ini, bahkan jika prosesor yang ditentukan adalah prosesor yang saat ini aktif.

Selain itu, jika konteks register tidak cocok dengan pengaturan mode prosesor saat ini, perintah ini menghasilkan output yang salah atau tidak berarti. Untuk menghindari kesalahan output, perintah yang bergantung pada status register gagal sampai Anda mengubah mode prosesor agar sesuai dengan konteks register. Untuk mengubah mode prosesor, gunakan perintah .effmach (Mesin Efektif),

Mengubah konteks register juga dapat mengubah konteks lokal. Dengan cara ini, konteks register dapat memengaruhi tampilan variabel lokal.

Jika ada eksekusi, langkah, atau pelacakan aplikasi terjadi, konteks register segera diatur ulang agar sesuai dengan posisi penghitung program. Dalam mode pengguna, konteks register juga diatur ulang jika proses atau utas saat ini diubah.

Konteks register memengaruhi jejak tumpukan, karena pelacakan tumpukan dimulai di lokasi tempat penunjuk tumpukan mendaftar (esp pada prosesor berbasis x86) menunjuk ke. Jika konteks register diatur ke nilai yang tidak valid atau tidak dapat diakses, jejak tumpukan tidak dapat diperoleh.

Anda dapat menerapkan titik henti prosesor (titik henti data) ke konteks register tertentu dengan menggunakan perintah .apply_dbp (Terapkan Titik Henti Data ke Konteks).

Konteks Lokal

Ketika program dijalankan, arti variabel lokal tergantung pada lokasi penghitung program, karena cakupan variabel tersebut hanya meluas ke fungsi yang ditentukan.

Saat Anda melakukan penelusuran kesalahan mode pengguna atau mode kernel, debugger menggunakan cakupan fungsi saat ini (bingkai saat ini pada tumpukan) sebagai konteks lokal. Untuk mengubah konteks ini, gunakan perintah .frame (Set Local Context), atau klik dua kali bingkai yang diinginkan di jendela Panggilan.

Dalam penelusuran kesalahan mode pengguna, konteks lokal selalu merupakan bingkai dalam jejak tumpukan utas saat ini. Dalam penelusuran kesalahan mode kernel, konteks lokal selalu merupakan bingkai dalam jejak tumpukan utas konteks register saat ini.

Anda hanya dapat menggunakan satu bingkai tumpukan pada satu waktu untuk konteks lokal. Variabel lokal dalam bingkai lain tidak dapat diakses.

Konteks lokal diatur ulang jika salah satu peristiwa berikut terjadi:

  • Eksekusi, langkah, atau pelacakan program apa pun

  • Setiap penggunaan pemisah utas (~) dalam perintah apa pun

  • Setiap perubahan pada konteks register

Ekstensi !for_each_frame memungkinkan Anda menjalankan satu perintah berulang kali, sekali untuk setiap bingkai dalam tumpukan. Perintah ini mengubah konteks lokal untuk setiap bingkai, menjalankan perintah yang ditentukan, lalu mengembalikan konteks lokal ke nilai aslinya.