在 C# 中設定條件式中斷點

已完成

Visual Studio Code 的 C# 偵錯工具支援一個選項,可以設定只有在符合條件時才會觸發的斷點。 這種類型的斷點稱為條件斷點。 您可以直接設定條件斷點,或編輯現有的斷點。

備註

Visual Studio Code 也支援條件式中斷點,其會根據「叫用」中斷點的次數觸發。

假設您正在除錯一個處理產品資訊的多維字串陣列的應用程式。 該陣列包含數千個數據點。 您正在偵錯的問題似乎發生在標示為 new的產品。 您的程式代碼會在 for 迴圈內處理陣列。 您需要在迴圈內設定中斷點,但只有在產品為 new 時才想要暫停。

使用標準斷點來檢查資料處理應用程式

  1. 使用下列程式代碼取代Program.cs檔案的內容:

    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) ;
    

    此程式代碼會使用名為 LoadProducts 的方法將數據載入 products 數位列。 載入數據之後,程式代碼會逐一查看陣列,並呼叫名為 Process1Process2的方法。

  2. 若要產生模擬程序的數據,請將下列方法新增至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;
        }
    }
    

    方法LoadProducts會產生 2000 個隨機產品識別碼,並將 existingnewobsolete 的值指派給產品描述欄位。 大約有 1% 產品標示 new的機會。

  3. 若要模擬數據處理,請將下列方法新增至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");
    }
    

    Process1Process2 方法會顯示進度訊息並傳回字串。

    請注意,當產品為new時,Process2方法會呼叫Process3

  4. 在 [Visual Studio Code 檔案] 功能表上,選取 [儲存]。

  5. 在Program.cs檔案頂端附近,在下列程式代碼行上設定斷點:

    result = Process1(products, i);
    
  6. 開啟 [執行和偵錯] 檢視,然後選取 [ 開始偵錯]。

  7. 使用逐步執行來瀏覽 Process1Process2 的程式碼。

    請注意 RUN AND DEBUG 檢視之 VARIABLES 和 CALL STACK 區段的更新。

  8. 繼續使用逐步執行來瀏覽程式碼,直到您看到 i 等於 3 為止。

    RUN AND DEBUG 檢視的 VARIABLES 區段會顯示指派給 i的值。

    請注意, Process1Process2 顯示訊息至 [偵錯控制台] 面板。 實際應用程式可能需要使用者互動,因為正在處理數據。 某些互動可能相依於正在處理的數據。

  9. 使用 [ 停止] 按鈕停止程式代碼執行。

使用表達式設定條件斷點

標準斷點非常適合逐步執行數據處理應用程式。 不過,在此案例中,您感興趣的是 new 產品,而不想逐一分析每個產品以找出屬於 new 的產品。 此案例是應該使用條件斷點時的良好範例。

  1. 以滑鼠右鍵按兩下現有的斷點,然後選取 [編輯斷點]。

  2. 輸入下列表示式:

    products[i,1] == "new";
    
  3. 請注意,當您按下 Enter 之後,表達式就不會再顯示。

  4. 若要暫時顯示表達式,請將滑鼠指標暫留在斷點上(紅點)。

  5. 若要執行已設定條件斷點的應用程式,請選取 [開始調試]

  6. 等候應用程式在條件斷點暫停。

  7. 請注意 [變數] 區段底下所顯示的 值 i

  8. 在 [ 偵錯控件] 工具列上,選取 [ 繼續]

  9. 請注意,i 的值已更新至變數區段。

  10. 選取 [逐步執行]

  11. 繼續選取 [逐步執行],直到 Process1 訊息顯示為止。

  12. 請注意, Process1 表示正在開發 新產品

  13. 花點時間考慮條件斷點所提供的優勢。

    在此模擬資料處理案例中,產品有大約 1% 的機會是 new。 如果您使用標準中斷點來偵錯問題,則不需要逐步瀏覽大約 100 個產品的分析,以尋找您感興趣的其中一個 new 產品。

    條件式斷點可在偵錯應用程式時節省您很多時間。

  14. 使用 [ 停止] 按鈕停止程式代碼執行。

祝賀! 您已成功設定條件斷點。

回顧

以下是本單元中要記住的兩個重要事項:

  • 使用標準斷點在每次遇到斷點時暫停應用程式。
  • 當布爾表達式評估為 true時,使用條件斷點暫停應用程式。