Configurare punti di interruzione condizionali in C#
Il debugger C# per Visual Studio Code supporta l'opzione per configurare un punto di interruzione che viene attivato solo se viene soddisfatta una condizione. Questo tipo di punto di interruzione è denominato punto di interruzione condizionale. I punti di interruzione condizionali possono essere configurati direttamente o modificando un punto di interruzione esistente.
Annotazioni
Visual Studio Code supporta anche un punto di interruzione condizionale che viene attivato in base al numero di volte in cui il punto di interruzione è stato "raggiunto".
Si supponga di eseguire il debug di un'applicazione che elabora le informazioni sul prodotto in una matrice di stringhe multidimensionali. La matrice include migliaia di punti dati. Il problema di cui si sta eseguendo il debug sembra verificarsi per i prodotti contrassegnati come new. Il codice elabora la matrice all'interno di un for ciclo. È necessario impostare un punto di interruzione all'interno del ciclo, ma si vuole sospendere solo quando i prodotti sono new.
Usare un punto di interruzione standard per esaminare un'applicazione di elaborazione dati
Sostituire il contenuto del file Program.cs con il codice seguente:
int productCount = 2000; string[,] products = new string[productCount, 2]; LoadProducts(products, productCount); for (int i = 0; i < productCount; i++) { string result; result = Process1(products, i); if (result != "obsolete") { result = Process2(products, i); } } bool pauseCode = true; while (pauseCode == true) ;Questo codice usa un metodo denominato
LoadProductsper caricare i dati nellaproductsmatrice. Dopo il caricamento dei dati, il codice scorre la matrice e chiama i metodi denominatiProcess1eProcess2.Per generare dati per i processi simulati, aggiungere il metodo seguente alla fine del file Program.cs:
static void LoadProducts(string[,] products, int productCount) { Random rand = new Random(); for (int i = 0; i < productCount; i++) { int num1 = rand.Next(1, 10000) + 10000; int num2 = rand.Next(1, 101); string prodID = num1.ToString(); if (num2 < 91) { products[i, 1] = "existing"; } else if (num2 == 91) { products[i, 1] = "new"; prodID = prodID + "-n"; } else { products[i, 1] = "obsolete"; prodID = prodID + "-0"; } products[i, 0] = prodID; } }Il
LoadProductsmetodo genera 2000 ID prodotto casuali e assegna un valore diexisting,newoobsoletea un campo di descrizione del prodotto. C'è circa un 1% possibilità che i prodotti siano contrassegnatinew.Per simulare l'elaborazione dei dati, aggiungere i metodi seguenti alla fine del file Program.cs:
static string Process1(string[,] products, int item) { Console.WriteLine($"Process1 message - working on {products[item, 1]} product"); return products[item, 1]; } static string Process2(string[,] products, int item) { Console.WriteLine($"Process2 message - working on product ID #: {products[item, 0]}"); if (products[item, 1] == "new") Process3(products, item); return "continue"; } static void Process3(string[,] products, int item) { Console.WriteLine($"Process3 message - processing product information for 'new' product"); }I
Process1metodi eProcess2visualizzano i messaggi di stato e restituiscono una stringa.Si noti che il
Process2metodo chiamaProcess3se il prodotto ènew.Nel menu File di Visual Studio Code, selezionare Salva.
Nella parte superiore del file Program.cs impostare un punto di interruzione nella riga di codice seguente:
result = Process1(products, i);Aprire la visualizzazione RUN AND DEBUG e quindi selezionare Avvia debug.
Usare Esegui istruzione per esaminare il codice per
Process1eProcess2.Notare gli aggiornamenti alle sezioni VARIABILI e STACK DI CHIAMATE della visualizzazione ESEGUI E DEBUG.
Continuare a usare Passo Dentro per esaminare il codice finché
iè uguale a 3.Nella sezione VARIABLES della visualizzazione RUN AND DEBUG viene visualizzato il valore assegnato a
i.Si noti che
Process1eProcess2visualizzano messaggi nel pannello DEBUG CONSOLE. Un'applicazione reale può richiedere interazioni utente durante l'elaborazione dei dati. Alcune interazioni possono dipendere dai dati elaborati.Usare il pulsante Arresta per arrestare l'esecuzione del codice.
Configurare un punto di interruzione condizionale usando un'espressione
Un punto di interruzione standard è ideale per analizzare passo a passo un'applicazione di elaborazione dati. Tuttavia, in questo caso, sei interessato ai new prodotti e non vuoi esaminare l'analisi di ogni prodotto per trovare quelli che sono new. Questo scenario è un buon esempio di utilizzo dei punti di interruzione condizionali.
Fare clic con il pulsante destro del mouse sul punto di interruzione esistente e quindi scegliere Modifica punto di interruzione.
Immettere l'espressione seguente:
products[i,1] == "new";Si noti che l'espressione non viene più visualizzata dopo aver premuto INVIO.
Per visualizzare temporaneamente l'espressione, posizionare il puntatore del mouse sul punto di interruzione (punto rosso).
Per eseguire l'applicazione con il punto di interruzione condizionale configurato, selezionare Avvia debug.
Attendere che l'applicazione venga sospesa in corrispondenza del punto di interruzione condizionale.
Si noti il valore di
ivisualizzato nella sezione VARIABLES.Sulla barra degli strumenti Controlli di debug selezionare Continua
Si noti che il valore di
iè stato aggiornato nella sezione VARIABLES.Selezionare Step Into.
Continuare a selezionare Esegui istruzione fino a quando non viene visualizzato il messaggio
Process1.Si noti che segnala che
Process1sta lavorando a un nuovo prodotto.Prendere in considerazione il vantaggio offerto dai punti di interruzione condizionali.
In questo scenario di elaborazione dati simulata, esiste circa 1% probabilità che un prodotto sia
new. Se si usa un punto di interruzione standard per eseguire il debug del problema, è necessario esaminare l'analisi di circa 100 prodotti per trovare uno deinewprodotti a cui si è interessati.I punti di interruzione condizionali consentono di risparmiare molto tempo durante il debug di un'applicazione.
Usare il pulsante Arresta per arrestare l'esecuzione del codice.
Congratulazioni! È stato configurato correttamente un punto di interruzione condizionale.
Riepilogo
Ecco due aspetti importanti da ricordare da questa unità:
- Usare un punto di interruzione standard per sospendere un'applicazione ogni volta che viene rilevato un punto di interruzione.
- Usare un punto di interruzione condizionale per sospendere un'applicazione quando un'espressione booleana restituisce
true.