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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk