Anteckning
Å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 här avsnittet innehåller exempel på MASM- och C++-uttryck som används i olika kommandon.
Alla andra avsnitt i den här hjälpdokumentationen använder MASM-uttryckssyntax i exemplen (om inget annat anges). Syntaxen för C++-uttryck är mycket användbar för att manipulera strukturer och variabler, men den parsar inte parametrarna för felsökningskommandon särskilt bra.
Om du använder felsökningskommandon för allmänna ändamål eller använder felsökningstillägg bör du ange MASM-uttryckssyntax som standardsyntax, till exempel med hjälp av .expr (Välj uttrycksutvärdering). Om du måste ha en specifik parameter för att använda C++-uttryckssyntax använder du syntaxen @@( ).
Om myInt är ett ULONG32 värde och om du använder MASM-uttrycksutvärderingen visar följande två exempel värdet för MyInt.
0:000> ?? myInt 
0:000> dd myInt L1 
I följande exempel visas dock adressen till myInt.
0:000> ? myInt 
Villkorsstyrda brytpunkter
Du kan använda jämförelseoperatorer för att skapa villkorsstyrda brytpunkter. I följande kodexempel används MASM-uttryckssyntax. Eftersom det aktuella standardradixet är 16 använder exemplet prefixet 0n så att talet 20 tolkas som ett decimaltal.
0:000> bp MyFunction+0x43 "j ( poi(MyVar)>0n20 ) ''; 'gc' " 
I föregående exempel är MyVar ett heltal i C-källan. Eftersom MASM-parsern behandlar alla symboler som adresser måste exemplet ha poi-operatorn för att avreferera MyVar.
Villkorsstyrda uttryck
I följande exempel skrivs värdet ecx ut om eax är större än ebx, 7 om eax är mindre än ebx och 3 om eax är lika med ebx. I det här exemplet används MASM-uttrycksutvärderaren, så likhetstecknet (=) är en jämförelseoperator, inte en tilldelningsoperator.
0:000> ? ecx*(eax>ebx) + 7*(eax<ebx) + 3*(eax=ebx) 
I C++-syntax anger @ tecknet ett register, ett dubbelt likhetstecken (==) är jämförelseoperatorn och koden måste uttryckligen gjutas från BOOL till int. I C++-syntaxen blir därför det tidigare kommandot följande.
0:000> ?? @ecx*(int)(@eax>@ebx) + 7*(int)(@eax<@ebx) + 3*(int)(@eax==@ebx) 
Exempel på MASM- och C++-blandade uttryck
Du kan inte använda källradsuttryck i ett C++-uttryck. I följande exempel används alternativ syntax för utvärderare @@( ) för att kapsla ett MASM-uttryck i ett C++-uttryck. I det här exemplet anges MyPtr som adressen till rad 43 i filen Myfile.c.
0:000> ?? MyPtr = @@( `myfile.c:43` )
I följande exempel anger du standarduttrycksutvärderingen till MASM och utvärderar sedan Expression2 som ett C++-uttryck och utvärderar Expression1 och Expression3 som MASM-uttryck.
0:000> .expr /s masm 
0:000> bp Expression1 + @@( Expression2 ) + Expression3 
Om myInt är ett ULONG64 värde och om du vet att det här värdet följs i minnet av en annan ULONG64 kan du ange en åtkomst brytpunkt på den platsen med hjälp av något av följande exempel. (Observera användningen av pekarearitmetik.)
0:000> ba r8 @@( &myInt + 1 ) 
0:000> ba r8 myInt + 8