Pseudo-Register szintaxis

A hibakereső számos olyan pszeudoregisztrálást támogat, amelyek bizonyos értékeket tartalmaznak.

A hibakereső bizonyos hasznos értékekre állítja be az automatikus pszeudoregisztrálásokat . A felhasználó által definiált pszeudoregisztrálások egész szám változók, amelyekbe írhat vagy olvashat.

Minden pszeudoregisztrátor egy dollárjellel ($) kezdődik. Ha MASM szintaxist használ, hozzáadhat egy at sign ( @ ) értéket a dollárjel elé. Ez a jel azt jelzi a hibakeresőnek, hogy a következő elem egy regiszter vagy pszeudo-regiszter, nem pedig szimbólum. Ha kihagyja a táblajelet, a hibakereső lassabban válaszol, mert az egész szimbólumtáblában kell keresnie.

A következő két parancs például ugyanazt a kimenetet hozza létre, a második parancs azonban gyorsabb.

0:000> ? $exp
Evaluate expression: 143 = 0000008f
0:000> ? @$exp
Evaluate expression: 143 = 0000008f

Ha létezik egy szimbólum ugyanazzal a névvel, mint a pszeudoregiszter, akkor hozzá kell adnia a kukac jelet.

C++ kifejezésszintaxis használata esetén mindig szükség van az at sign ( @ ) kifejezésre.

Az r (Registers) parancs kivételt képez a szabály alól. A hibakereső mindig az első argumentumát regiszterként vagy pszeudoregisztrálásként értelmezi. (Az at sign nem kötelező vagy engedélyezett.) Ha az r parancsnak van egy második argumentuma, az az alapértelmezett kifejezés szintaxisa szerint lesz értelmezve. Ha az alapértelmezett kifejezés szintaxisa C++, az alábbi paranccsal másolja a $t 2 pszeudoregisztrálást az $t 1 pszeudoregisztrálásba.

0:000> r $t1 = @$t2

Automatikus Pseudo-Registers

A hibakereső automatikusan beállítja a következő álregisztrálásokat.

Pszeudoregisztrálás Leírás

$ea

Az utolsó végrehajtott utasítás érvényes címe. Ha ez az utasítás nem rendelkezik érvényes címmel, a hibakereső a "Hibás regisztrálási hiba" hibaüzenetet jeleníti meg. Ha ez az utasítás két érvényes címmel rendelkezik, a hibakereső megjeleníti az első címet.

$ea 2

Az utolsó végrehajtott utasítás második érvényes címe. Ha ez az utasítás nem rendelkezik két érvényes címmel, a hibakereső a "Hibás regisztrálási hiba" hibaüzenetet jeleníti meg.

$exp

Az utolsó kiértékelt kifejezés.

$ra

Jelenleg a veremen található visszatérési cím.

Ez a cím különösen hasznos végrehajtási parancsok esetén. A g @$ra például addig folytatódik, amíg meg nem találja a visszatérési címet (bár a gu (Go Up) az aktuális függvényből való "kilépés" pontosabb módja).

$ip

Az utasításmutató regiszter.

x86-alapú processzorok: Ugyanaz, mint az eip. Itanium-alapú processzorok:Iip-hez kapcsolódó. (További információkért tekintse meg a táblázatot követő megjegyzést.) x64-alapú processzorok: Ugyanaz, mint a rip.

$eventip

Az utasításmutató az aktuális esemény idején. Ez a mutató általában megegyezik az $ip-val, hacsak nem váltott szálat, vagy manuálisan nem módosította az utasításmutató értékét.

$previp

Az utasításmutató az előző esemény idején. (A hibakeresőbe való betörés eseménynek számít.)

$relip

Az aktuális eseményhez kapcsolódó utasításmutató. Ágkövetés esetén ez a mutató az ágforrásra mutató mutató.

$scopeip

Az aktuális helyi környezet (más néven hatókör) utasításmutatója.

$exentry

Az aktuális folyamat első végrehajtható fájljának belépési pontjához tartozó cím.

$retreg

Az elsődleges visszatérési érték regisztere.

x86-alapú processzorok: Ugyanaz, mint az eax. Itanium-alapú processzorok: Ugyanaz, mint a ret0. x64-alapú processzorok: Ugyanaz, mint a rax.

$retreg 64

Az elsődleges visszatérési érték nyilvántartása 64 bites formátumban.

x86 processzor: Ugyanaz, mint az edx:eax pár.

$csp

Az aktuális hívásveremmutató. Ez a mutató a leginkább a hívásverem mélységét reprezentáló regiszter.

x86-alapú processzorok: Ugyanaz, mint esp. Itanium-alapú processzorok: Ugyanaz, mint a bsp. x64-alapú processzorok: Ugyanaz, mint az rsp.

$p

Az az érték, amelyet az utolsó d* (Memória megjelenítése) parancs kinyomtatott.

$proc

Az aktuális folyamat címe (vagyis az EPROCESS-blokk címe).

$thread

Az aktuális szál címe. Kernel módú hibakeresés esetén ez a cím az ETHREAD-blokk címe. Felhasználói módú hibakeresés esetén ez a cím a szálkörnyezeti blokk (TEB) címe.

$peb

Az aktuális folyamat folyamatkörnyezeti blokkjának (PEB) címe.

$teb

Az aktuális szál szálkörnyezeti blokkjának (TEB) címe.

$tpid

Az aktuális szálat birtoklő folyamat folyamatazonosítója (PID).

$tid

Az aktuális szál szálazonosítója.

$dtid

$dpid

$dsid

$bpszám

A megfelelő töréspont címe. A $bp 3 (vagy $bp 03) például arra a töréspontra hivatkozik, amelynek töréspont-azonosítója 3. A szám mindig tizedes szám. Ha egyetlen töréspont sem rendelkezik számazonosítóval, $bpSzám értéke nulla lesz. A töréspontokról további információt a Töréspontok használata című témakörben talál.

$frame

Az aktuális keretindex. Ez az index ugyanaz a keretszám, amelyet a .frame (Set Local Context) parancs használ.

$dbgtime

A hibakereső által futtatott számítógép szerint az aktuális idő.

$callret

A .call (Call Function) által hívott vagy .fnret /s parancsban használt utolsó függvény visszatérési értéke. A $callret adattípusa ennek a visszatérési értéknek az adattípusa.

$extret

$extin

$clrex

$lastclrex

Csak felügyelt hibakeresés: Az utoljára észlelt közös nyelvi futtatókörnyezet (CLR) kivételobjektum címe.

$ptrsize

A mutató mérete. Kernel módban ez a méret a célszámítógép mutatómérete.

$pagesize

A memória egy oldalán található bájtok száma. Kernel módban ez a méret a célszámítógép oldalmérete.

$pcr

$pcrb

$argreg

$exr_chance

Az aktuális kivétel rekord valószínűsége.

$exr_code

Az aktuális kivételrekord kivételkódja.

$exr_numparams

Az aktuális kivételrekord paramétereinek száma.

$exr_param0

A 0. paraméter értéke az aktuális kivételrekordban.

$exr_param1

Az 1. paraméter értéke az aktuális kivételrekordban.

$exr_param2

A 2. paraméter értéke az aktuális kivételrekordban.

$exr_param3

A 3. paraméter értéke az aktuális kivételrekordban.

$exr_param4

A 4. paraméter értéke az aktuális kivételrekordban.

$exr_param5

Az 5. paraméter értéke az aktuális kivételrekordban.

$exr_param6

A 6. paraméter értéke az aktuális kivételrekordban.

$exr_param7

A 7. paraméter értéke az aktuális kivételrekordban.

$exr_param8

A 8. paraméter értéke az aktuális kivételrekordban.

$exr_param9

A 9. paraméter értéke az aktuális kivételrekordban.

$exr_param10

A 10. paraméter értéke az aktuális kivételrekordban.

$exr_param11

A 11. paraméter értéke az aktuális kivételrekordban.

$exr_param12

A 12. paraméter értéke az aktuális kivételrekordban.

$exr_param13

A 13. paraméter értéke az aktuális kivételrekordban.

$exr_param14

A 14. paraméter értéke az aktuális kivételrekordban.

$bug_code

Ha hibaellenőrzés történt, ez a hibakód. Az élő kernel módú hibakeresésre és a kernel összeomlási memóriaképére vonatkozik.

$bug_param1

Hibaellenőrzés esetén ez az 1. paraméter értéke. Az élő kernel módú hibakeresésre és a kernel összeomlási memóriaképére vonatkozik.

$bug_param2

Hibaellenőrzés esetén ez a 2. paraméter értéke. Az élő kernel módú hibakeresésre és a kernel összeomlási memóriaképére vonatkozik.

$bug_param3

Hibaellenőrzés esetén ez a 3. paraméter értéke. Az élő módú kernelhibakeresésre és a kernel összeomlási memóriaképére vonatkozik.

$bug_param4

Ha hibaellenőrzés történt, ez a 4. paraméter értéke. ** Élő kernelmódú hibakeresésre és kernel-összeomlási memóriaképekre vonatkozik.

Előfordulhat, hogy egyes álregisztrálási regiszterek bizonyos hibakeresési forgatókönyvekben nem érhetők el. Például nem használhatja a $peb, $tid és $tpid változókat, amikor egy felhasználói módú minidumpot vagy bizonyos kernelmódú dump fájlokat hibakeres. Lesznek olyan helyzetek, amikor a szálak információi a ~ (Szál állapota) alapján tanulhatók meg, de a $tid nem. Az első hibakereső eseményen nem használhatja a $previp pszeudoregisztrálást. Nem használhatja a $relip pszeudoregisztert, hacsak nem végez ágkövetést. Ha egy elérhetetlen pszeudo-regisztert használ, szintaxis hiba lép fel.

Egy struktúra címét tartalmazó pszeudoregisztrálót – például $thread, $proc, $teb, $peb és $lastclrex – a C++ kifejezésértékelő megfelelő adattípusa alapján értékelik ki, a MASM-kifejezésértékelőben azonban nem. A parancs ? $teb például a TEB címét jeleníti meg, míg a parancs ?? @$teb a teljes TEB-struktúrát jeleníti meg. További információ: Kifejezések kiértékelése.

Itanium-alapú processzor esetén az iip-regiszter kötegre van igazítva, ami azt jelenti, hogy az aktuális utasítást tartalmazó csomag 0. pontjára mutat, még akkor is, ha egy másik pontot hajtanak végre. Tehát az iip nem a teljes utasításmutató. A $ip pszeudoregiszter a tényleges utasítás mutatója, beleértve a csomagot és a rést is. A címmutatókat ($ra, $retreg, $eventip, $previp, $relip és $exentry) tartalmazó többi álregisztrátor struktúrája megegyezik az összes processzor $ip .

Az r paranccsal módosíthatja a $ip értékét. Ez a módosítás automatikusan módosítja a megfelelő regisztert is. Amikor a végrehajtás folytatódik, az új utasításmutató-címen folytatódik. Ez a regisztráció az egyetlen automatikus pszeudoregisztrálás, amelyet manuálisan módosíthat.

Jegyzet A MASM szintaxisában a $ip pszeudoregisztrálást jelezheti egy ponttal ( . ). Ehhez az időszakhoz ne adjon hozzá at sign (@) jelet, és ne használja az r parancs első paramétereként az időszakot. Ez a szintaxis C++ kifejezésben nem engedélyezett.

Az automatikus álregisztrálások hasonlóak az automatikus aliasokhoz. Az automatikus aliasokat azonban használhatja az aliasokhoz kapcsolódó tokenekkel együtt (például ${ }), és ilyen tokenekkel nem használhat ál-regisztereket.

User-Defined Pseudo-Registers

20 felhasználó által definiált pszeudoregisztrálás létezik ($t 0, $t 1, ..., $t 19). Ezek a pszeudoregiszterek olyan változók, amelyeket a hibakeresőben olvashat és írhat. Ezekben a pszeudoregisztrálásokban bármilyen egész számot tárolhat. Ezek különösen hasznosak lehetnek ciklusváltozókként.

Az alábbi példában látható módon az r (Registers) paranccsal írhat ezen pszeudoregisztrálások egyikére.

0:000> r $t0 = 7
0:000> r $t1 = 128*poi(MyVar)

Az összes pszeudoregisztrátorhoz hasonlóan a felhasználó által definiált pszeudoregisztrálást is használhatja bármely kifejezésben, ahogy az alábbi példa is mutatja.

0:000> bp $t3 
0:000> bp @$t4 
0:000> ?? @$t1 + 4*@$t2 

A pszeudoregisztrálás mindig egész számként van begépelve, kivéve, ha a ? kapcsolót az r paranccsal együtt használja. Ha ezt a kapcsolót használja, a pszeudo-regiszter felveszi a hozzá rendelt típusát. A következő parancs például a UNICODE_STRING** típust és a 0x0012FFBC értéket rendeli hozzá $t 15-höz.

0:000> r? $t15 = * (UNICODE_STRING*) 0x12ffbc

A felhasználó által definiált pszeudoregisztrálások alapértelmezett értékként nullát használnak a hibakereső indításakor.

Jegyzet Az aliasok $u 0, $u 1, ..., $u 9 nem álregisztrálások, a hasonló megjelenésük ellenére. További információ ezekről az aliasokról: Aliasok használata.

példa

Az alábbi példa egy töréspontot állít be, amelyet az aktuális szál az NtOpenFile hívásakor minden alkalommal elüt. Ezt a töréspontot azonban nem éri el, amikor más szálak meghívják az NtOpenFile-t.

kd> bp /t @$thread nt!ntopenfile

példa

Az alábbi példa addig hajt végre egy parancsot, amíg a regiszter nem tartalmaz egy megadott értéket. Először tegye a következő kódot a feltételes léptetéshez egy "eaxstep" nevű szkriptfájlba.

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

Ezután adja ki a következő parancsot.

t "$<eaxstep"

A hibakereső végrehajt egy lépést, majd futtatja a parancsot. Ebben az esetben a hibakereső futtatja a szkriptet, amely vagy 1234-et jelenít meg, vagy megismétli a folyamatot.