Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Hata ayıklayıcıda adresleri belirtmenin çeşitli yolları vardır.
Belgeler özel olarak başka bir adres türünü belirtmesi dışında, adresler normalde sanal adreslerdir. Kullanıcı modunda, hata ayıklayıcı sanal adresleri geçerli işlemin sayfa dizinine göre yorumlar. Çekirdek modunda hata ayıklayıcı, işlem bağlamının belirttiği işlemin sayfa dizinine göre sanal adresleri yorumlar. Kullanıcı modu adres bağlamını da doğrudan ayarlayabilirsiniz. Kullanıcı modu adres bağlamı hakkında daha fazla bilgi için bkz . .context (User-Mode Adres Bağlamını Ayarla).
MASM ifadelerinde poi işlecini kullanarak herhangi bir işaretçiye başvuruda bulunabilirsiniz. Örneğin, 0x0000008e'ed57b108 adresindeki işaretçi adres konumu 0x805287637256 işaret ederse, aşağıdaki iki komut eşdeğerdir.
0:000> dd 805287637256
0:000> dd poi(000000bb`7ee23108)
Bellek adresi örneğini görüntüleme
Poi kullanma örneğini görmek için iş parçacığı ortam bloğunun (TEB) CurrentLocale uzaklığını belirleyin. @$teb adlı, geçerli program sayacı konumu gibi ortak adresleri barındıran bir sahte yazmaç örneğini görüntülemek için dx komutunu kullanın.
0:000> dx @$teb
@$teb : 0x1483181000 [Type: _TEB *]
...
[+0x108] CurrentLocale : 0x409 [Type: unsigned long]
CurrentLocale , TEB'in başından itibaren +0x108. Ardından bu konumun bellek adresini belirleyin.
0:000> ? @$teb + 0x108
Evaluate expression: 613867303176 = 0000008e`ed57b108
Bu adresi çözmek ve 0x409 CurrentLocale değerini içerip içermediğini görmek için poi kullanın.
0:000> ? poi(0000008e`ed57b108)
Evaluate expression: 1033 = 00000000`00000409
C++ hata ayıklayıcısı ifadelerinde, işaretçiler C++ içindeki işaretçiler gibi davranır. Ancak, sayılar tamsayı olarak yorumlanır. Gerçek bir sayıyı ertelemeniz gerekiyorsa, aşağıdaki örnekte gösterildiği gibi önce bu sayıyı atamanız gerekebilir.
Bunu denemek için ifade değerlendiricisini C++ olarak ayarlamak için .expr kullanın.
0:000> .expr /s C++
Current expression evaluator: C++ - C++ source expressions
İfade değerlendiricisi C++ olarak ayarlandığında, uzun kullanarak yayınlayabiliriz.
0:000> d *((long*)0x00000014`83181108 )
00000000`00000409 ???????? ???????? ???????? ????????
Sayısal değerleri atama hakkında daha fazla bilgi için bkz. C++ Numaraları ve İşleçleri.
İfade değerlendirici c++ olarak ayarlanırsa, poi işaretçisini @@masm() ile kaydırarak ifadenin yalnızca bu kısmını MASM ifade değerlendiricisi tarafından değerlendirebiliriz.
0:000> .expr /s c++
Current expression evaluator: C++ - C++ source expressions
0:000> ? @@masm(poi(00000078`267d7108))
Evaluate expression: 1033 = 00000000`00000409
İki ifade değerlendiricisi hakkında daha fazla bilgi için bkz. İfadeleri Değerlendirme.
Ayrıca, özgün kaynak dosya adını ve satır numarasını belirterek bir uygulamadaki adresi belirtebilirsiniz. Bu bilgileri belirtme hakkında daha fazla bilgi için bkz. Kaynak Satırı Sözdizimi.
Adres Aralıkları
Adres aralığını bir adres çifti veya adres ve nesne sayısına göre belirtebilirsiniz.
Bir adres çiftine göre aralık belirtmek için başlangıç adresini ve bitiş adresini belirtin. Örneğin, aşağıdaki örnek 0x00001000 adresinden başlayarak 8 baytlık bir aralıktır.
0x00001000 0x00001007
Adres ve nesne sayısına göre bir adres aralığı belirtmek için bir adres bağımsız değişkeni, L harfi (büyük veya küçük harf) ve bir değer bağımsız değişkeni belirtin. Adres, başlangıç adresini belirtir. değeri, incelenecek veya görüntülenecek nesne sayısını belirtir. Nesnenin boyutu komutuna bağlıdır. Örneğin, nesne boyutu 1 bayt ise, aşağıdaki örnek 0x00001000 adresinden başlayarak 8 baytlık bir aralıktır.
0x00001000 L8
Ancak, nesne boyutu çift sözcük (32 bit veya 4 bayt) ise, aşağıdaki iki aralığın her biri 8 baytlık bir aralık verir.
0x00001000 0x00001007
0x00001000 L2
L Boyut aralığı tanımlayıcısı
Değeri belirtmenin iki yolu daha vardır ( LBoyut aralığı tanımlayıcısı):
L?Boyut (soru işaretiyle) LBoyutu ile aynı anlama gelir, ancak L?Boyut hata ayıklayıcının otomatik aralık sınırını kaldırır. Genellikle 256 MB'lık bir aralık sınırı vardır çünkü daha büyük aralıklar tipografik hatalardır. 256 MB'tan büyük bir aralık belirtmek istiyorsanız L?Boyut söz dizimini kullanmalısınız.
L-Size (kısa çizgi ile), belirtilen adreste sona erecek bir uzunluk Boyutu aralığı belirtir. Örneğin, 80000000 L20 0x80000000 ile 0x8000001F arasında aralığı, 80000000 L-20 ise 0x7FFFFFE0 ile 0x7FFFFFFF arasında bir aralığı belirtir.
Adres aralıklarını soran bazı komutlar bağımsız değişken olarak tek bir adresi kabul eder. Bu durumda komut, aralığın boyutunu hesaplamak için bazı varsayılan nesne sayısını kullanır. Genellikle, adres aralığının son parametre olduğu komutlar bu söz dizimine izin verir. Her komutun tam söz dizimi ve varsayılan aralık boyutu için her komutun başvuru konularına bakın.
Arama bellek aralığı örneği
İlk olarak, MASM ifade değerlendiricisini kullanarak rip talimat işaretçisi yazmacının adresini belirleyeceğiz.
0:000> ? @rip
Evaluate expression: 140720561719153 = 00007ffc`0f180771
Ardından 00007ffc'0f180771'den başlayarak s (Belleği Ara) komutunu kullanarak 100000 için arama yapacağız. L100000 kullanarak aranacak aralığı belirtiriz.
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.
...
Bunun gibi bir aralığı iki bellek adresi kullanarak da belirtebiliriz.
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.
...
Son olarak L uzunluk parametresini kullanarak bellek aralığında geriye doğru arama yapabilirsiniz.
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
Birleştirilmemiş bellek örneği
Bu örnekte, üç bayttan oluşan kodu çözmek için u (unassemble) komutu ve L parametresi kullanılır.
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
Bunun gibi bir araya getirmek için üç baytlık bir bellek aralığı da belirtebilirsiniz.
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
Adres Modları ve Segment Desteği
x86 tabanlı platformlarda CDB ve KD aşağıdaki adresleme modlarını destekler. Bu modlar ön ekleriyle ayırt edilir.
| Önek | İsim | Adres türleri |
|---|---|---|
| % | düz | 32 bit adresler (ayrıca 32 bit segmentlere işaret eden 16 bit seçiciler) ve 64 bit sistemlerde 64 bit adresler. |
| & | sanal 86 | Gerçek mod adresleri. Yalnızca x86 tabanlı. |
| # | düz | Gerçek mod adresleri. Yalnızca x86 tabanlı. |
Düz ve sanal 86 modları arasındaki fark, düz 16 bit adresin kesim değerini seçici olarak kullanması ve segment tanımlayıcısını aramasıdır. Ancak sanal 86 adresi seçicileri kullanmaz ve bunun yerine doğrudan alt 1 MB alanına eşler.
Geçerli varsayılan mod dışında bir adresleme modu kullanarak belleğe erişiyorsanız, mevcut adres modunu değiştirmek için adres modu ön eklerini kullanabilirsiniz.
Argümanlarla Baş Etme
Adres bağımsız değişkenleri değişkenlerin ve işlevlerin konumunu belirtir. Aşağıdaki tabloda, CDB ve KD'de kullanabileceğiniz çeşitli adreslerin söz dizimi ve anlamı açıklanmaktadır.
| Sözdizimi | Anlamı |
|---|---|
ofset baskı |
Geçerli yürütme moduyla uyumlu bir türe sahip olan sanal bellek alanındaki mutlak adres. Örneğin, geçerli yürütme modu 16 bit ise, uzaklık 16 bittir. Yürütme modu 32 bit kesimliyse, uzaklık 32 bit kesimli olur. |
&[[ segment:]] ofset |
Gerçek adres. x86 tabanlı ve x64 tabanlı. |
%segment:[[ offset]] |
Kesimli 32 bit veya 64 bit adres. x86 tabanlı ve x64 tabanlı. |
%[[ uzaklık]] |
Sanal bellek alanında mutlak bir adres (32 bit veya 64 bit). x86 tabanlı ve x64 tabanlı. |
name[[ +|− ]] uzaklığı |
Düz bir 32 bit veya 64 bit adres. ad herhangi bir simge olabilir. uzaklık , uzaklığı belirtir. Bu kaydırma, ön ekin belirttiği herhangi bir adres modu olabilir. Varsayılan mod adresini belirtmek için bir ön ek kullanılmaz. Uzaklığı pozitif (+) veya negatif (−) değer olarak belirtebilirsiniz. |
Kesim tanımlayıcı bilgilerini görüntülemek için dg (Görüntü Seçici) komutunu kullanın.
Ayrıca Bkz.
Bellekle ilgili bilgileri görüntülemek için !address komutunu kullanın.
Bellekte arama yapmak için s (Bellekte Ara) komutunu kullanın.
Belleğin içeriğini görüntülemek için d, da, db, dc, dd, dD, df, dp, dq, du, dw (Belleği Görüntüle) komutunu kullanın.
Bellek penceresi kullanarak belleği görüntüleme ve düzenleme hakkında bilgi için bkz. Bellek Penceresi Kullanma.