Bagikan melalui


Sintaks Rentang Alamat dan Alamat

Ada beberapa cara untuk menentukan alamat di debugger.

Alamat biasanya merupakan alamat virtual, kecuali ketika dokumentasi secara khusus menunjukkan jenis alamat lain. Dalam mode pengguna, debugger menafsirkan alamat virtual sesuai dengan direktori halaman proses saat ini. Dalam mode kernel, debugger menginterpretasikan alamat virtual sesuai dengan direktori halaman proses yang ditentukan konteks proses . Anda juga dapat langsung mengatur konteks alamat mode pengguna. Untuk informasi selengkapnya tentang konteks alamat mode pengguna, lihat .context (Set User-Mode Address Context).

Dalam ekspresi MASM, Anda dapat menggunakan operator poi untuk mendereferensikan pointer apa pun. Misalnya, jika penunjuk ke alamat 0x0000008e'ed57b108 menunjuk ke lokasi alamat 0x805287637256, dua perintah berikut setara.

0:000> dd 805287637256
0:000> dd poi(000000bb`7ee23108)

Tampilkan contoh alamat memori

Untuk melihat contoh penggunaan poi, tentukan offset untuk CurrentLocale dari blok lingkungan utas (TEB). Gunakan perintah dx untuk menampilkan @$teb, yang merupakan contoh pseudo-registers, yang menyimpan alamat umum, seperti lokasi penghitung program saat ini.

0:000> dx @$teb
@$teb                 : 0x1483181000 [Type: _TEB *]

...

    [+0x108] CurrentLocale    : 0x409 [Type: unsigned long]

CurrentLocale adalah +0x108 dari awal TEB. Selanjutnya tentukan alamat memori lokasi tersebut.

0:000> ? @$teb + 0x108
Evaluate expression: 613867303176 = 0000008e`ed57b108

Gunakan poi untuk mendereferensikan alamat tersebut untuk melihat bahwa alamat tersebut berisi nilai CurrentLocale 0x409.

0:000> ? poi(0000008e`ed57b108)
Evaluate expression: 1033 = 00000000`00000409

Dalam ekspresi debugger C++, penunjuk berkinerja seperti penunjuk di C++. Namun, angka ditafsirkan sebagai bilangan bulat. Jika Anda harus menangguhkan angka aktual, Anda mungkin perlu mentransmisiannya terlebih dahulu, seperti yang ditunjukkan contoh berikut.

Untuk mencoba ini, gunakan .expr untuk mengatur evaluator ekspresi ke C++.

0:000> .expr /s C++
Current expression evaluator: C++ - C++ source expressions

Dengan evaluator ekspresi diatur ke C++, kita dapat mentransmisikan menggunakan panjang.

0:000> d *((long*)0x00000014`83181108 ) 
00000000`00000409  ???????? ???????? ???????? ????????

Untuk informasi selengkapnya tentang transmisi nilai numerik, lihat Nomor dan Operator C++.

Jika evaluator ekspresi diatur ke c++, kita dapat membungkus penunjuk poi dengan @@masm(), untuk hanya memiliki bagian ekspresi yang dievaluasi oleh evaluator ekspresi MASM.

0:000> .expr /s c++
Current expression evaluator: C++ - C++ source expressions

0:000> ? @@masm(poi(00000078`267d7108))
Evaluate expression: 1033 = 00000000`00000409

Untuk informasi selengkapnya tentang dua evaluator ekspresi, lihat Mengevaluasi Ekspresi.

Anda juga dapat menunjukkan alamat dalam aplikasi dengan menentukan nama file sumber asli dan nomor baris. Untuk informasi selengkapnya tentang cara menentukan informasi ini, lihat Sintaks Baris Sumber.

Rentang Alamat

Anda dapat menentukan rentang alamat menurut sepasang alamat atau menurut alamat dan jumlah objek.

Untuk menentukan rentang menurut sepasang alamat, tentukan alamat awal dan alamat akhir. Misalnya, contoh berikut adalah rentang 8 byte, dimulai dari alamat 0x00001000.

0x00001000  0x00001007

Untuk menentukan rentang alamat menurut alamat dan jumlah objek, tentukan argumen alamat, huruf L (huruf besar atau huruf kecil), dan argumen nilai. Alamat menentukan alamat awal. Nilai menentukan jumlah objek yang akan diperiksa atau ditampilkan. Ukuran objek tergantung pada perintah . Misalnya, jika ukuran objek adalah 1 byte, contoh berikut adalah rentang 8 byte, dimulai dari alamat 0x00001000.

0x00001000  L8

Namun, jika ukuran objek adalah kata ganda (32 bit atau 4 byte), dua rentang berikut masing-masing memberikan rentang 8-byte.

0x00001000  0x00001007
0x00001000  L2

Penentu rentang Ukuran L

Ada dua cara lain untuk menentukan nilai (penentu rentang UkuranL):

  • L?Ukuran (dengan tanda tanya) berarti sama dengan UkuranL, kecuali L itu?Ukuran menghapus batas rentang otomatis debugger. Biasanya, ada batas rentang 256 MB, karena rentang yang lebih besar adalah kesalahan tipografi. Jika Anda ingin menentukan rentang yang lebih besar dari 256 MB, Anda harus menggunakan L?Sintaks ukuran .

  • L-Size (dengan tanda hubung) menentukan rentang panjang Ukuran yang berakhir pada alamat yang diberikan. Misalnya, 800000000 L20 menentukan rentang dari 0x80000000 hingga 0x8000001F, dan 80000000 L-20 menentukan rentang dari 0x7FFFFFE0 hingga 0x7FFFFFFF.

Beberapa perintah yang meminta rentang alamat menerima satu alamat sebagai argumen. Dalam situasi ini, perintah menggunakan beberapa jumlah objek default untuk menghitung ukuran rentang. Biasanya, perintah yang rentang alamatnya adalah parameter akhir mengizinkan sintaks ini. Untuk sintaks yang tepat dan ukuran rentang default untuk setiap perintah, lihat topik referensi untuk setiap perintah.

Contoh rentang memori pencarian

Pertama kita akan menentukan alamat daftar pointer instruksi sobek menggunakan evaluator ekspresi MASM.

0:000> ? @rip 
Evaluate expression: 140720561719153 = 00007ffc`0f180771

Kemudian kita akan mencari mulai dari 00007ffc'0f180771, untuk 100000 menggunakan perintah s (Search Memory). Kami menentukan rentang untuk mencari menggunakan L100000.

0:000> s -a 00007ffc`0f180771 L100000 "ntdll"  
00007ffc`0f1d48fa  6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00  ntdll\ldrinit.c.
00007ffc`0f1d49c2  6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00  ntdll\ldrmap.c..
00007ffc`0f1d4ab2  6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63  ntdll\ldrredirec
00007ffc`0f1d4ad2  6e 74 64 6c 6c 5c 6c 64-72 73 6e 61 70 2e 63 00  ntdll\ldrsnap.c.
...

Kita juga dapat menentukan rentang yang sama seperti ini menggunakan dua alamat memori.

0:000> s -a 0x00007ffc`0f180771 0x00007ffc`0f280771 "ntdll"  
00007ffc`0f1d48fa  6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00  ntdll\ldrinit.c.
00007ffc`0f1d49c2  6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00  ntdll\ldrmap.c..
00007ffc`0f1d4ab2  6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63  ntdll\ldrredirec
00007ffc`0f1d4ad2  6e 74 64 6c 6c 5c 6c 64-72 73 6e 61 70 2e 63 00  ntdll\ldrsnap.c.
...

Terakhir kita dapat mencari mundur dalam rentang memori dengan menggunakan parameter panjang L.

0:000> s -a 00007ffc`0f1d4ad2 L-100000 "ntdll"  
00007ffc`0f1d48fa  6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00  ntdll\ldrinit.c.
00007ffc`0f1d49c2  6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00  ntdll\ldrmap.c..
00007ffc`0f1d4ab2  6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63  ntdll\ldrredirec

Contoh memori yang tidak dirakit

Contoh ini, menggunakan perintah u (unassemble) dan parameter L untuk menghapus tiga byte kode.

0:000> u 00007ffc`0f1d48fa L3
ntdll!`string'+0xa:
00007ffc`0f1d48fa 6e              outs    dx,byte ptr [rsi]
00007ffc`0f1d48fb 7464            je      ntdll!`string'+0x21 (00007ffc`0f1d4961)
00007ffc`0f1d48fd 6c              ins     byte ptr [rdi],dx

Atau tentukan rentang memori tiga byte untuk tidak dirakit seperti ini.

0:000> u 00007ffc`0f1d48fa 00007ffc`0f1d48fd
ntdll!`string'+0xa:
00007ffc`0f1d48fa 6e              outs    dx,byte ptr [rsi]
00007ffc`0f1d48fb 7464            je      ntdll!`string'+0x21 (00007ffc`0f1d4961)
00007ffc`0f1d48fd 6c              ins     byte ptr [rdi],dx

Mode Alamat dan Dukungan Segmen

Pada platform berbasis x86, CDB dan KD mendukung mode pengalamatan berikut. Mode-mode ini dibedakan oleh awalannya.

Prefiks Nama Jenis alamat
% flat Alamat 32-bit (juga pemilih 16-bit yang menunjuk ke segmen 32-bit) dan alamat 64-bit pada sistem 64-bit.
& virtual 86 Alamat mode nyata. Hanya berbasis x86.
# biasa Alamat mode nyata. Hanya berbasis x86.

Perbedaan antara mode biasa dan virtual 86 adalah bahwa alamat 16-bit biasa menggunakan nilai segmen sebagai pemilih dan mencari pendeskripsi segmen. Tetapi alamat virtual 86 tidak menggunakan pemilih dan sebaliknya memetakan langsung ke 1 MB yang lebih rendah.

Jika Anda mengakses memori melalui mode pengalamatan yang bukan mode default saat ini, Anda dapat menggunakan awalan mode alamat untuk mengambil alih mode alamat saat ini.

Argumen Alamat

Argumen alamat menentukan lokasi variabel dan fungsi. Tabel berikut menjelaskan sintaks dan arti dari berbagai alamat yang dapat Anda gunakan di CDB dan KD.

Sintaks Makna

offset

Alamat absolut dalam ruang memori virtual, dengan jenis yang sesuai dengan mode eksekusi saat ini. Misalnya, jika mode eksekusi saat ini adalah 16 bit, offsetnya adalah 16 bit. Jika mode eksekusi tersegmentasi 32-bit, offset disegmentasi 32-bit.

&[[ segmen:]] offset

Alamat aslinya. berbasis x86 dan berbasis x64.

%segmen:[[ offset]]

Alamat 32-bit atau 64-bit tersegmentasi. berbasis x86 dan berbasis x64.

%[[ offset] ]

Alamat absolut (32-bit atau 64-bit) di ruang memori virtual. berbasis x86 dan berbasis x64.

name[[ +| ]] offset

Alamat datar 32-bit atau 64-bit. nama dapat menjadi simbol apa pun. offset menentukan offset. Offset ini bisa menjadi mode alamat apa pun yang ditunjukkan awalannya. Tidak ada awalan yang menentukan alamat mode default. Anda dapat menentukan offset sebagai nilai positif (+) atau negatif (−).

Gunakan perintah dg (Pemilih Tampilan) untuk melihat informasi deskriptor segmen.

Lihat juga

Untuk menampilkan informasi tentang memori, gunakan perintah !address .

Untuk mencari memori, gunakan perintah s (Search Memory).

Untuk menampilkan konten memori, gunakan perintah d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory).

Untuk informasi tentang bagaimana Anda dapat melihat dan mengedit memori menggunakan jendela Memori lihat Menggunakan Jendela Memori.