Configurare punti di interruzione condizionali in C#

Completato

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

  1. 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 LoadProducts per caricare i dati nella products matrice. Dopo il caricamento dei dati, il codice scorre la matrice e chiama i metodi denominati Process1 e Process2.

  2. 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 LoadProducts metodo genera 2000 ID prodotto casuali e assegna un valore di existing, newo obsolete a un campo di descrizione del prodotto. C'è circa un 1% possibilità che i prodotti siano contrassegnati new.

  3. 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 Process1 metodi e Process2 visualizzano i messaggi di stato e restituiscono una stringa.

    Si noti che il Process2 metodo chiama Process3 se il prodotto è new.

  4. Nel menu File di Visual Studio Code, selezionare Salva.

  5. Nella parte superiore del file Program.cs impostare un punto di interruzione nella riga di codice seguente:

    result = Process1(products, i);
    
  6. Aprire la visualizzazione RUN AND DEBUG e quindi selezionare Avvia debug.

  7. Usare Esegui istruzione per esaminare il codice per Process1 e Process2.

    Notare gli aggiornamenti alle sezioni VARIABILI e STACK DI CHIAMATE della visualizzazione ESEGUI E DEBUG.

  8. 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 Process1 e Process2 visualizzano messaggi nel pannello DEBUG CONSOLE. Un'applicazione reale può richiedere interazioni utente durante l'elaborazione dei dati. Alcune interazioni possono dipendere dai dati elaborati.

  9. 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.

  1. Fare clic con il pulsante destro del mouse sul punto di interruzione esistente e quindi scegliere Modifica punto di interruzione.

  2. Immettere l'espressione seguente:

    products[i,1] == "new";
    
  3. Si noti che l'espressione non viene più visualizzata dopo aver premuto INVIO.

  4. Per visualizzare temporaneamente l'espressione, posizionare il puntatore del mouse sul punto di interruzione (punto rosso).

  5. Per eseguire l'applicazione con il punto di interruzione condizionale configurato, selezionare Avvia debug.

  6. Attendere che l'applicazione venga sospesa in corrispondenza del punto di interruzione condizionale.

  7. Si noti il valore di i visualizzato nella sezione VARIABLES.

  8. Sulla barra degli strumenti Controlli di debug selezionare Continua

  9. Si noti che il valore di i è stato aggiornato nella sezione VARIABLES.

  10. Selezionare Step Into.

  11. Continuare a selezionare Esegui istruzione fino a quando non viene visualizzato il messaggio Process1.

  12. Si noti che segnala che Process1 sta lavorando a un nuovo prodotto.

  13. 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 dei new prodotti a cui si è interessati.

    I punti di interruzione condizionali consentono di risparmiare molto tempo durante il debug di un'applicazione.

  14. 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.