Aracılığıyla paylaş


Pseudo-Register Söz Dizimi

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.