Punti di interruzione condizionali in WinDbg e altri debugger Windows

I punti di interruzione condizionali in WinDbg e altri debugger Windows sono utili quando è necessario interrompere solo se viene soddisfatta una condizione specifica.

Viene creato un punto di interruzione condizionale con il parametro "/w" per il comando bp (Imposta punto di interruzione) o un altro punto di interruzione. La sintassi di base del comando è:

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

Il punto di interruzione causerà un'interruzione nel debugger solo quando la condizione specificata è true. "w" è un'abbreviazione di "when". L'espressione di condizione può essere qualsiasi elemento che può essere usato con il comando dx (Display Debugger Object Model Expression). Sono incluse la maggior parte delle espressioni di stile C++, tra cui confronti, aritmetici, operazioni puntatore e altre. Ad esempio, un punto di interruzione condizionale di base che si interrompe solo quando una variabile è superiore a 20 può essere scritta come:

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

Poiché la condizione viene valutata usando il modello a oggetti del debugger, è anche possibile sfruttare i vantaggi del supporto natVis. Ad esempio, supponendo che myVec sia un std::vector<int>, è possibile creare una condizione, ad esempio:

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

L'interruzione si verifica quando viene eseguita la riga 143 di mysource.cpp mentre la variabile myVec ha 4 elementi.

Oltre a natvis, è anche possibile richiamare una funzione JavaScript. Se si carica uno script usando la finestra di script WinDbg o il comando .scriptload (Load Script) che contiene una funzione denominata "myFunc", è possibile impostare un punto di interruzione simile al seguente:

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

Per altre informazioni sulla scrittura di funzioni e estensioni JavaScript nel debugger, vedere JavaScript Debugger Scripting

Anche se le espressioni di livello superiore sono in genere le più utili, è anche possibile valutare i registri usando queste espressioni. Ad esempio, è possibile creare un punto di interruzione che viene attivato solo quando il puntatore allo stack raggiunge una soglia:

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

Sintassi del punto di interruzione condizionale legacy

Prima della disponibilità del parametro "/w" ai comandi del punto di interruzione, è consigliabile impostare i punti di interruzione condizionali usando il comando j (Execute If - Else) o il token .if, seguito dal comando gc (Vai dal punto di interruzione condizionale). Anche se questi metodi di impostazione dei punti di interruzione condizionali non sono più consigliati, funzionano ancora e questa sintassi può essere visualizzata in altre origini.

La sintassi di base per un punto di interruzione condizionale tramite il comando j è la seguente:

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

La sintassi di base per un punto di interruzione condizionale che usa il token .if è la seguente:

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