Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det finns flera sätt att ange adresser i felsökningsprogrammet.
Adresser är normalt virtuella adresser, förutom när dokumentationen specifikt anger en annan typ av adress. I användarläge tolkar felsökningsprogrammet virtuella adresser enligt sidkatalogen för den aktuella processen. I kernelläge tolkar felsökningsprogrammet virtuella adresser enligt den processkatalog som processkontexten anger. Du kan också ange adresskontexten i användarläge direkt. Mer information om adresskontexten för användarläge finns i .context (Set User-Mode Address Context).
I MASM-uttryck kan du använda poi-operatorn för att avreferera valfri pekare. Om pekaren på adressen 0x0000008e'ed57b108 pekar på adressplatsen 0x805287637256 är följande två kommandon likvärdiga.
0:000> dd 805287637256
0:000> dd poi(000000bb`7ee23108)
Exempel på visningsminnesadress
Om du vill se ett exempel på hur du använder poi kan du fastställa förskjutningen för CurrentLocale för trådmiljöblocket (TEB). Använd dx-kommandot för att visa @$teb, som är ett exempel på pseudoregister, som innehåller vanliga adresser, till exempel den aktuella programräknarens plats.
0:000> dx @$teb
@$teb : 0x1483181000 [Type: _TEB *]
...
[+0x108] CurrentLocale : 0x409 [Type: unsigned long]
CurrentLocale är +0x108 från början av TEB. Bestäm sedan minnesadressen för den platsen.
0:000> ? @$teb + 0x108
Evaluate expression: 613867303176 = 0000008e`ed57b108
Använd poi för att avreferera adressen för att se att den innehåller värdet CurrentLocale för 0x409.
0:000> ? poi(0000008e`ed57b108)
Evaluate expression: 1033 = 00000000`00000409
I C++-felsökningsuttryck beter sig pekare som pekare i C++. Tal tolkas dock som heltal. Om du måste ta referens till ett faktiskt tal kan du behöva konvertera det först, som följande exempel visar.
Om du vill prova detta använder du .expr för att ange uttrycksutvärderaren till C++.
0:000> .expr /s C++
Current expression evaluator: C++ - C++ source expressions
Med uttrycksutvärderingen inställd på C++ kan vi casta med long.
0:000> d *((long*)0x00000014`83181108 )
00000000`00000409 ???????? ???????? ???????? ????????
Mer information om hur du gjuter numeriska värden finns i C++-tal och operatorer.
Om uttrycksutvärderaren är inställd på c++, kan vi omsluta poi-pekaren med @@masm(), så att bara den delen av uttrycket utvärderas av MASM-uttrycksutvärderaren.
0:000> .expr /s c++
Current expression evaluator: C++ - C++ source expressions
0:000> ? @@masm(poi(00000078`267d7108))
Evaluate expression: 1033 = 00000000`00000409
Mer information om de två uttrycksutvärderingarna finns i Utvärdera uttryck.
Du kan också ange en adress i ett program genom att ange det ursprungliga källfilens namn och radnummer. Mer information om hur du anger den här informationen finns i Källradssyntax.
Adressområden
Du kan ange ett adressintervall efter ett par adresser eller efter en adress och ett antal objekt.
Om du vill ange ett intervall efter ett par adresser anger du startadressen och slutadressen. Följande exempel är till exempel ett intervall på 8 byte, med början vid adressen 0x00001000.
0x00001000 0x00001007
Om du vill ange ett adressintervall efter adress och antal objekt anger du ett adressargument, bokstaven L (versaler eller gemener) och ett värdeargument. Adressen anger startadressen. Värdet anger antalet objekt som ska undersökas eller visas. Objektets storlek beror på kommandot . Om objektstorleken till exempel är 1 byte är följande exempel ett intervall på 8 byte, med början vid adressen 0x00001000.
0x00001000 L8
Men om objektstorleken är ett dubbelt ord (32 bitar eller 4 byte) ger följande två intervall ett intervall på 8 byte vardera.
0x00001000 0x00001007
0x00001000 L2
L Storleksintervallsspecificerare
Det finns två andra sätt att ange värdet (L-storleksintervallsspecificeraren):
L?Storlek (med ett frågetecken) betyder samma som L-storlek, förutom att L?Storleken tar bort felsökarens automatiska intervallgräns. Det finns vanligtvis en intervallgräns på 256 MB, eftersom större intervall är typografiska fel. Om du vill ange ett intervall som är större än 256 MB måste du använda L?Storlekssyntax .
L-Size (med bindestreck) anger ett längdintervall Storlek som slutar på den angivna adressen. Till exempel anger 80000000 L20 intervallet från 0x80000000 till 0x8000001F och 80000000 L-20 anger intervallet från 0x7FFFFFE0 till 0x7FFFFFFF.
Vissa kommandon som ber om adressintervall accepterar en enda adress som argument. I det här fallet använder kommandot vissa standardobjektantal för att beräkna storleken på intervallet. Normalt tillåter kommandon för vilka adressintervallet är den sista parametern den här syntaxen. Den exakta syntaxen och standardintervallstorleken för varje kommando finns i referensavsnitten för varje kommando.
Exempel på sökminnesintervall
Först ska vi fastställa adressen till rip-instruktionspekarens register med hjälp av MASM-uttrycksutvärderingen.
0:000> ? @rip
Evaluate expression: 140720561719153 = 00007ffc`0f180771
Sedan söker vi från och med 00007ffc'0f180771 efter 100000 med hjälp av kommandot s (Search Memory). Vi anger det intervall som ska sökas med hjälp av L100000.
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.
...
Vi kan också ange samma intervall som detta med hjälp av två minnesadresser.
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.
...
Slutligen kan vi söka bakåt i minnesintervallet med hjälp av parametern L- length.
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
Exempel på avmontering av minne
I det här exemplet används kommandot u (unassemble) och parametern L för att demontera tre byte kod.
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
Eller ange ett minnesområde på tre byte som ska avkodas så här.
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
Adresslägen och segmentstöd
På x86-baserade plattformar stöder CDB och KD följande adresseringslägen. Dessa lägen särskiljs av deras prefix.
| Prefix | Namn | Adresstyper |
|---|---|---|
| % | flat | 32-bitarsadresser (även 16-bitarsväljare som pekar på 32-bitarssegment) och 64-bitarsadresser i 64-bitarssystem. |
| & | virtual 86 | Adresser i verkligt läge. x86-baserad endast. |
| # | slätt | Adresser i verkligt läge. x86-baserad endast. |
Skillnaden mellan vanliga och virtuella 86-lägen är att en vanlig 16-bitars adress använder segmentvärdet som väljare och söker upp segmentbeskrivningen. Men en virtuell 86-adress använder inte väljare och mappar i stället direkt till de lägre 1 MB.
Om du kommer åt minnet via ett adressläge som inte är det aktuella standardläget kan du använda adresslägesprefixen för att åsidosätta det aktuella adressläget.
Adressargument
Adressargument anger platsen för variabler och funktioner. I följande tabell förklaras syntaxen och innebörden av de olika adresser som du kan använda i CDB och KD.
| Syntax | Innebörd |
|---|---|
förskjuta |
Den absoluta adressen i det virtuella minnesutrymmet, med en typ som motsvarar det aktuella exekveringsläget. Om det aktuella körläget till exempel är 16 bitar blir förskjutningen 16 bitar. Om körningsläget är 32-bitars segmenterat, är förskjutningen 32-bitars segmenterad. |
&[[ segment:]] offset |
Den riktiga adressen. x86-baserad och x64-baserad. |
%segment:[[ offset]] |
En segmenterad 32-bitars eller 64-bitars adress. x86-baserad och x64-baserad. |
%[[ offset]] |
En absolut adress (32-bitars eller 64-bitars) i virtuellt minnesutrymme. x86-baserad och x64-baserad. |
name[[ +|− ]] offset |
En platt 32-bitars eller 64-bitars adress. kan vara valfri symbol. offset anger förskjutningen. Den här förskjutningen kan vara det adressläge som prefixet anger. Inget prefix anger en standardlägesadress. Du kan ange förskjutningen som ett positivt (+) eller negativt (−) värde. |
Använd kommandot dg (Display Selector) för att visa segmentbeskrivningsinformation.
Se även
Om du vill visa information om minne använder du kommandot !address .
Om du vill söka i minnet använder du kommandot s (Search Memory).
Om du vill visa innehållet i minnet använder du kommandot d, da, db, dc, dd, dD, df, dp, dq, du, dw (Display Memory).
Information om hur du kan visa och redigera minne med hjälp av ett minnesfönster finns i Använda ett minnesfönster.