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ı, belirli değerleri tutan birkaç sahte kaydı destekler.
Hata ayıklayıcı, otomatik sahte yazmaçları belirli yararlı değerlere ayarlar. Kullanıcı tanımlı sahte yazmaçlar , yazabileceğiniz veya okuyabileceğiniz tamsayı değişkenleridir.
Tüm sahte yazmaçlar bir dolar işareti ($) ile başlar. MASM söz dizimi kullanıyorsanız, dolar işaretinden önce bir at işareti ( @ ) ekleyebilirsiniz. Bu, hata ayıklayıcıya aşağıdaki belirtecin bir simge değil, bir yazmaç veya sahte kayıt olduğunu bildirir. at işaretini atlarsanız, hata ayıklayıcısı sembol tablosunun tamamında arama yapmak zorunda olduğundan daha yavaş yanıt verir.
Örneğin, aşağıdaki iki komut aynı çıkışı oluşturur, ancak ikinci komut daha hızlıdır.
0:000> ? $exp
Evaluate expression: 143 = 0000008f
0:000> ? @$exp
Evaluate expression: 143 = 0000008f
Sahte kayıtla aynı ada sahip bir simge varsa, at işaretini eklemeniz gerekir.
C++ ifade söz dizimi kullanıyorsanız, at işareti ( @ ) her zaman gereklidir.
r (Registers) komutu bu kural için bir özel durumdur. Hata ayıklayıcı her zaman ilk bağımsız değişkenini bir yazmaç veya sahte kayıt olarak yorumlar. (At işareti gerekli değildir ve izin verilmez.) r komutu için ikinci bir bağımsız değişken varsa, varsayılan ifade söz dizimine göre yorumlanır. Varsayılan ifade söz dizimi C++ ise, $t 2 sahte kaydını $t 1 sahte kaydına kopyalamak için aşağıdaki komutu kullanmanız gerekir.
0:000> r $t1 = @$t2
Otomatik Pseudo-Registers
Hata ayıklayıcı aşağıdaki sahte kayıtları otomatik olarak ayarlar.
| Sözde kayıt | Açıklama |
|---|---|
$ea |
Yürütülen son yönergenin etkili adresi. Bu yönergenin etkili bir adresi yoksa, hata ayıklayıcısı "Hatalı kayıt hatası" görüntüler. Bu yönergenin iki etkili adresi varsa, hata ayıklayıcı ilk adresi görüntüler. |
$ea 2 |
Gerçekleştirilen son komutun ikinci etkili adresi. Bu yönergenin iki etkili adresi yoksa, hata ayıklayıcısı "Hatalı kayıt hatası" görüntüler. |
$exp |
Değerlendirilen son ifade. |
$ra |
Şu anda yığında olan dönüş adresi. Bu adres özellikle yürütme komutlarında kullanışlıdır. Örneğin , g @$ra dönüş adresi bulunana kadar devam eder ( ancak gu (Yukarı Git) geçerli işlevden "dışarı çıkmanın" daha kesin bir yoludur). |
$ip |
Yönerge işaretçisi kayıt. x86 tabanlı işlemciler:Eip ile aynı. Itanium tabanlı işlemciler:iip ile ilgili. (Daha fazla bilgi için bu tablodaki nota bakın.) x64 tabanlı işlemciler:rip ile aynı. |
$eventip |
Geçerli olay sırasında yönerge işaretçisi. İş parçacıklarını değiştirmediğiniz veya komut işaretçisinin değerini el ile değiştirmediğiniz sürece, bu işaretçi genellikle $ip ile eşleşir. |
$previp |
Önceki olayın gerçekleştiği zamandaki komut işaretçisi. (Hata ayıklayıcıya girmek olay olarak sayılır.) |
$relip |
Geçerli olayla ilgili bir yönerge işaretçisi. Dal izleme sırasında, bu işaretçi dal kaynağının işaretçisidir. |
$scopeip |
Geçerli yerel bağlamın yönerge işaretçisi ( kapsam olarak da bilinir). |
$exentry |
Mevcut işlemin ilk yürütülebilir dosyasının giriş noktasının adresi. |
$retreg |
Birincil dönüş değeri yazmaç. x86 tabanlı işlemciler:Eax ile aynı. Itanium tabanlı işlemciler:Ret0 ile aynı. x64 tabanlı işlemciler:Rax ile aynı. |
$retreg 64 |
64 bit biçiminde birincil dönüş değeri yazmaç. x86 işlemci:edx:eax çifti ile aynı. |
$csp |
Geçerli çağrı yığını işaretçisi. Bu işaretçi, çağrı yığını derinliğini en çok temsil eden yazmaçtır. x86 tabanlı işlemciler:Esp ile aynı. Itanium tabanlı işlemciler:bsp ile aynı. x64 tabanlı işlemciler:Rsp ile aynı. |
$p |
Son d* (Belleği Görüntüle) komutunun yazdırıldığı değer. |
$proc |
Geçerli işlemin adresi (yani EPROCESS bloğunun adresi). |
$thread |
Geçerli iş parçacığının adresi. Çekirdek modunda hata ayıklamada, bu adres ETHREAD bloğunun adresidir. Kullanıcı modunda hata ayıklamada, bu adres iş parçacığı ortam bloğunun (TEB) adresidir. |
$peb |
Geçerli işlemin işlem ortamı bloğunun (PEB) adresi. |
$teb |
Geçerli iş parçacığının iş parçacığı ortam bloğunun (TEB) adresi. |
$tpid |
Geçerli iş parçacığının sahibi olan işlemin işlem kimliği (PID). |
$tid |
Geçerli iş parçacığının iş parçacığı kimliği. |
$dtid |
|
$dpid |
|
$dsid |
|
$bpNumarası |
İlgili kesme noktasının adresi. Örneğin , $bp 3 (veya $bp 03), kesme noktası kimliği 3 olan kesme noktasına başvurur. Sayı her zaman ondalık sayıdır. Sayı kimliğine sahip bir kesme noktası yoksa, $bpSayı sıfır olarak değerlendirilir. Kesme noktaları hakkında daha fazla bilgi için bkz. Kesme Noktalarını Kullanma. |
$frame |
Geçerli çerçeve dizini. Bu dizin, .frame (Yerel Bağlamı Ayarla) komutunun kullandığı çerçeve numarasıyla aynıdır. |
$dbgtime |
Hata ayıklayıcının üzerinde çalıştığı bilgisayara göre geçerli saat. |
$callret |
.call (Çağrı İşlevi) adlı veya .fnret /s komutunda kullanılan son işlevin dönüş değeri. $callret veri türü, bu dönüş değerinin veri türüdür. |
$extret |
|
$extin |
|
$clrex |
|
$lastclrex |
Yalnızca yönetilen hata ayıklama: Son karşılaşılan ortak dil çalışma zamanı (CLR) özel durum nesnesinin adresi. |
$ptrsize |
İşaretçinin boyutu. Çekirdek modunda, bu boyut hedef bilgisayardaki işaretçi boyutudur. |
$pagesize |
Bir bellek sayfasındaki bayt sayısı. Çekirdek modunda, bu boyut hedef bilgisayardaki sayfa boyutudur. |
$pcr |
|
$pcrb |
|
$argreg |
|
$exr_chance |
Geçerli özel durum kaydının olasılığı. |
$exr_code |
Mevcut özel durum kaydı için istisna kodu. |
$exr_numparams |
Geçerli özel durum kaydındaki parametre sayısı. |
$exr_param0 |
Geçerli özel durum kaydındaki Parametre 0 değeri. |
$exr_param1 |
Geçerli özel durum kaydındaki Parametre 1 değeri. |
$exr_param2 |
Geçerli özel durum kaydındaki Parametre 2 değeri. |
$exr_param3 |
Geçerli özel durum kaydındaki Parametre 3 değeri. |
$exr_param4 |
Geçerli özel durum kaydındaki Parametre 4 değeri. |
$exr_param5 |
Geçerli özel durum kaydındaki Parametre 5 değeri. |
$exr_param6 |
Geçerli özel durum kaydındaki Parametre 6 değeri. |
$exr_param7 |
Geçerli özel durum kaydındaki Parametre 7 değeri. |
$exr_param8 |
Geçerli özel durum kaydındaki Parametre 8 değeri. |
$exr_param9 |
Geçerli özel durum kaydındaki Parametre 9 değeri. |
$exr_param10 |
Geçerli özel durum kaydındaki Parametre 10 değeri. |
$exr_param11 |
Geçerli özel durum kaydındaki Parametre 11 değeri. |
$exr_param12 |
Geçerli özel durum kaydındaki Parametre 12 değeri. |
$exr_param13 |
Geçerli özel durum kaydındaki Parametre 13 değeri. |
$exr_param14 |
Geçerli özel durum kaydında Parametre 14'ün değeri. |
$bug_code |
Bir hata denetimi oluştuysa, bu hata kodudur. Canlı çekirdek modunda hata ayıklamayı ve çekirdek çökme dökümlerini kapsar. |
$bug_param1 |
Bir hata denetimi oluştuysa, bu Parametre 1'in değeridir. Canlı çekirdek modunda gerçek zamanlı hata ayıklama ve çekirdek çökme dökümleri için geçerlidir. |
$bug_param2 |
Bir hata denetimi oluştuysa, bu Parametre 2'nin değeridir. Canlı çekirdek modunda hata ayıklama ve çekirdek çökme dökümleri için geçerlidir. |
$bug_param3 |
Bir hata denetimi oluştuysa, bu Parametre 3'ün değeridir. Çalışan çekirdek modu hata ayıklaması ve çekirdek çökme dökümleri için geçerlidir. |
$bug_param4 |
Bir hata denetimi oluştuysa, bu Parametre 4'ün değeridir. Canlı çekirdek modunda hata ayıklama ve çekirdek çökme dökümleri için geçerlidir. |
Bu sahte yazmaçlardan bazıları belirli hata ayıklama senaryolarında kullanılamayabilir. Örneğin, kullanıcı modu minidump veya belirli çekirdek modu döküm dosyalarında hata ayıklarken $peb, $tid ve $tpidkullanamazsınız. ~ (İş Parçacığı Durumu) ile iş parçacığı bilgilerini öğrenebileceğiniz, ancak $tid ile öğrenemeyeceğiniz durumlar olacaktır. İlk hata ayıklayıcı olayında $previp sahte kaydını kullanamazsınız. Dallanma izleme yapmıyorsanız, $relip sahte kaydını kullanamazsınız. Mevcut olmayan bir sahte kayıt kullanırsanız, söz dizimi hatası oluşur.
$thread, $proc, $teb, $peb ve $lastclrex gibi bir yapının adresini tutan sahte kayıt, MASM ifade değerlendiricisinde değil, C++ ifade değerlendiricisindeki uygun veri türüne göre değerlendirilir. Örneğin , ? $teb komutu TEB'in adresini görüntülerken ?? @$teb komutu TEB yapısının tamamını görüntüler. Daha fazla bilgi için bkz . İfadeleri Değerlendirme.
Itanium tabanlı bir işlemcide iip yazmaç paket hizalamalıdır, yani, başka bir yuva çalıştırılıyor olsa bile, geçerli talimatı içeren paketteki 0 numaralı yuvayı işaret eder. Bu nedenle iip tam yönerge işaretçisi değildir. $ip sahte kayıt, paket ve yuva dahil olmak üzere gerçek yönerge işaretçisidir. Adres işaretçilerini tutan diğer sahte yazmaçlar ($ra, $retreg, $eventip, $previp, $relip ve $exentry), tüm işlemcilerdeki $ip ile aynı yapıya sahiptir.
r komutunu kullanarak $ip değerini değiştirebilirsiniz. Bu değişiklik, ilgili kaydı da otomatik olarak değiştirir. Yürütme devam ettiğinde, yeni yönerge işaretçisi adresinde devam eder. Bu kayıt, el ile değiştirebileceğiniz tek otomatik sahte kayıttır.
Not MASM söz diziminde, bir nokta ( . ) ile $ip sahte kaydını belirtebilirsiniz. Bu dönemden önce bir at işareti (@) eklemezsiniz ve r komutunun ilk parametresi olarak nokta kullanmazsınız. C++ ifadesinde bu söz dizimine izin verilmez.
Otomatik sahte yazmaçlar otomatik diğer adlara benzer. Ancak otomatik diğer adları, ${ } gibi diğer adlarla ilgili belirteçlerle kullanabilirsiniz ve bu belirteçlerle psevdoregister kullanamazsınız.
User-Defined Pseudo-Registers
20 kullanıcı tanımlı sahte yazmaç vardır ($t 0, $t 1, ..., $t 19). Bu sahte kayıt, hata ayıklayıcı aracılığıyla okuyup yazabileceğiniz değişkenlerdir. Bu sahte kayıtlarda herhangi bir tamsayı değerini depolayabilirsiniz. Bunlar özellikle döngü değişkenleri olarak yararlı olabilir.
Bu sahte yazmaçlardan birine yazmak için, aşağıdaki örnekte gösterildiği gibi r (Yazmaçlar) komutunu kullanın.
0:000> r $t0 = 7
0:000> r $t1 = 128*poi(MyVar)
Tüm sahte yazmaçlar gibi, aşağıdaki örnekte gösterildiği gibi herhangi bir ifadede kullanıcı tanımlı sahte yazmaç kullanabilirsiniz.
0:000> bp $t3
0:000> bp @$t4
0:000> ?? @$t1 + 4*@$t2
r komutuyla birlikte ? anahtarını kullanmadığınız sürece, sahte kayıt her zaman tamsayı olarak yazılır. Bu anahtarı kullanırsanız, sözde bellek kaydı kendisine ne atanırsa o türü alır. Örneğin, aşağıdaki komut UNICODE_STRING** türünü ve 0x0012FFBC değerini $t 15'e atar.
0:000> r? $t15 = * (UNICODE_STRING*) 0x12ffbc
Kullanıcı tanımlı sanal yazmaçlar, hata ayıklayıcı başlatıldığında varsayılan değer olarak sıfır kullanır.
Not:$u0, $u1, ..., $u9 diğer adları benzer görünümlerine rağmen sahte kayıtlar değildir. Bu diğer adlar hakkında daha fazla bilgi için bkz. Diğer Adları Kullanma.
Örneği
Aşağıdaki örnek, geçerli iş parçacığı NtOpenFile çağrıldığında her seferinde tetiklenen bir kesme noktası ayarlar. Ancak diğer iş parçacıkları NtOpenFile'ı çağırdığında bu kesme noktası tetiklenmez.
kd> bp /t @$thread nt!ntopenfile
Örneği
Aşağıdaki örnek, kayıt belirtilen değeri tutana kadar bir komut yürütür. İlk olarak, koşullu adımlama için aşağıdaki kodu "eaxstep" adlı bir betik dosyasına yerleştirin.
.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }
Ardından aşağıdaki komutu çalıştırın.
t "$<eaxstep"
Hata ayıklayıcı bir adım gerçekleştirir ve ardından komutunuzu çalıştırır. Bu durumda, hata ayıklayıcısı betiği çalıştırır ve bu betik 1234 görüntüler veya işlemi yineler.