Dela via


Villkorliga brytpunkter i WinDbg och andra Windows-felsökare

Villkorliga brytpunkter i WinDbg och andra Windows-felsökare är användbara när du bara behöver bryta in om ett visst villkor är uppfyllt.

En villkorlig brytpunkt skapas med parametern "/w" till bp (Ange brytpunkt) eller annat brytpunktskommando. Den grundläggande syntaxen för kommandot är:

0:000> bp /w "(Condition)" Address

Brytpunkten orsakar bara ett avbrott i felsökningsprogrammet när det angivna villkoret är sant. "w" är en förkortning för "when". Villkorsuttrycket kan vara allt som kan användas med kommandot dx (Display Debugger Object Model Expression). Detta omfattar de flesta C++-formatuttryck, inklusive jämförelser, aritmetik, pekaråtgärder och andra. Till exempel kan en grundläggande villkorlig brytpunkt som bara bryts in när en variabel är mer än 20 skrivas som:

0:000> bp /w "MyVar > 20" `mysource.cpp:143`

Eftersom villkoret utvärderas med hjälp av felsökningsobjektmodellen kan du också dra nytta av saker som NatVis-stöd. Om myVec till exempel är ett std::vector<int>kan du skapa ett villkor som:

0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`

Detta bryter in när rad 143 i mysource.cpp körs medan variabeln myVec har 4 element.

Utöver natvis kan du också anropa en JavaScript-funktion. Om du läser in ett skript med hjälp av WinDbg-skriptfönstret eller kommandot .scriptload (Load Script) som innehåller en funktion med namnet "myFunc" kan du ange en brytpunkt så här:

0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`

Mer information om hur du skriver JavaScript-funktioner och -tillägg i felsökningsprogrammet finns i Skript för JavaScript-felsökningsprogram

Även om uttryck på högre nivå vanligtvis är mest användbara är det också möjligt att utvärdera register med hjälp av dessa uttryck. Du kan till exempel skapa en brytpunkt som bara utlöses när stackpekaren når något tröskelvärde:

0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`

Syntax för äldre villkorsstyrd brytpunkt

Innan parametern "/w" var tillgänglig för brytpunktskommandona var det rekommenderade sättet att ange villkorsstyrda brytpunkter att använda kommandot j (Kör om – Annars) eller .if-token följt av kommandot gc (Gå från villkorsstyrd brytpunkt). Dessa metoder för att ställa in villkorsstyrda brytpunkter rekommenderas inte längre, men de fungerar fortfarande och du kan se den här syntaxen som refereras i andra källor.

Den grundläggande syntaxen för en villkorsstyrd brytpunkt med hjälp av j-kommandot är följande:

0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "

Den grundläggande syntaxen för en villkorsstyrd brytpunkt med hjälp av .if-token är följande:

0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"