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 l'interruzione 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 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 di 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`
Questa operazione si interrompe 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 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 Scripting del debugger JavaScript
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 si attiva solo quando il puntatore dello 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, il modo consigliato per impostare i punti di interruzione condizionali consiste nell'usare 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 condizionale non sono più consigliati, funzionano ancora ed è possibile che questa sintassi faccia riferimento 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}"