Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.