使用監看式視窗和快速監看式來監看變數

偵錯時,您可以使用 [監看式] 視窗和 [快速監看式] 來監看變數和運算式。 視窗只能在偵錯工作階段期間使用。

[監看式] 視窗可以在偵錯時顯示數個變數。 [快速監看式] 對話方塊會一次顯示單一變數,而且必須先關閉,才能繼續偵錯。 如需使用快速監看式的詳細資訊,請參閱使用快速監看式觀察單一變數或運算式。

注意

如果這是您第一次嘗試對程式碼偵錯,建議您先閱讀適用於完全初學者的偵錯偵錯技術和工具,再瀏覽本文。

使用監看式視窗觀察變數

您可以開啟多個 [監看式] 視窗,並在 [監看式] 視窗中觀察多個變數。

例如,在下列程式碼中的 abc 值上設定監看式:

int main()
{
    int a, b, c;
    a = 1;
    b = 2;
    c = 0;

    for (int i = 0; i < 10; i++)
    {
        a++;
        b *= 2;
        c = a + b;
    }

    return 0;
}

  1. 按一下左邊界、選取 [偵錯]>[切換中斷點],或按 F9,在 c = a + b; 行上設定中斷點。

  2. 選取綠色的 [開始] 箭頭或 [偵錯]>[開始偵錯],或按 F5。 執行會在中斷點暫停。

  3. 選取 [偵錯]>[視窗]>[監看式]>[監看式 1],或按 Ctrl+Alt+W>1 開啟 [監看式] 視窗。

    您可以選取 Windows 234 來開啟其他 [監看式] 視窗。

  4. [監看式] 視窗中,選取空白資料列,然後輸入變數 a。 針對 bc 執行相同的動作。

    Screenshot of Watch variables.

    Screenshot of Watch variables.

  5. 視需要選取 [偵錯]>[逐步執行] 或按 F11 鍵繼續偵錯。 [監看式] 視窗中的變數值會隨著您逐一查看 for 迴圈而變更。

注意

僅限 C++,

  • 您可能需要限定變數名稱的內容,或使用變數名稱的運算式。 內容是變數所在的函式、原始程式檔或模組。 如果您必須限定內容,請在 [監看式] 視窗中的 [名稱] 中使用內容運算子 (C++) 語法。

  • 您可以使用 $<登錄名稱>@<登錄名稱>將登錄名稱和變數名稱新增至 [監看式] 視窗中的 [名稱]。 如需詳細資訊,請參閱 Pseudovariables

在監看式視窗中使用運算式

您可以在 [監看式] 視窗中觀察偵錯工具所辨識的任何有效運算式。

例如,針對上一節的程式碼,您可以在 [監看式] 視窗中輸入 (a + b + c) / 3 來取得三個值的平均值:

Screenshot of Watch expression.

Screenshot of Watch expression.

一般來說,[監看式] 視窗的運算式評估規則與您的程式碼撰寫語言的運算式評估規則相同。 如果運算式發生語法錯誤,應會在程式碼編輯器中看到相同的編譯器錯誤。 例如,上述運算式中的錯字會在 [監看式] 視窗中產生此錯誤:

Screenshot of Watch expression error.

Screenshot of Watch expression error.

具有兩條波浪線圖示的圓形可能會出現在 [監看式] 視窗中。 此圖示表示偵錯工具不會因為潛在的跨執行緒相依性而評估運算式。 評估程式碼需要應用程式中的其他執行緒暫時執行,但是由於您處於中斷模式,因此應用程式中的所有執行緒通常會停止。 允許暫時執行其他執行緒可能會對應用程式的狀態造成無法預期的結果,且偵錯工具會忽略這些執行緒上的中斷點和例外狀況之類的事件。

在監看式視窗中搜尋

您可以使用每個視窗上方的搜尋列,在 [監看式] 視窗的 [名稱]、[值] 和 [類型] 資料行中搜尋關鍵字。 按 ENTER 鍵或選取其中一個箭號來執行搜尋。 若要取消進行中的搜尋,請在搜尋列中選取「x」圖示。

分別使用左右箭號(Shift+F3 和 F3)在找到的相符項目之間巡覽。

Screenshot of Search in Watch Window.

若要讓搜尋更深入,請使用 [監看式] 視窗頂端的 [搜尋更深入] 下拉式清單,選取您想要搜尋到巢狀物件的層級數。

在 [監看式] 視窗中釘選屬性

注意

.NET Core 3.0 或更高版本支援此功能。

您可以使用 [可釘選的屬性] 工具,在監看式視窗中依屬性快速檢查物件。 若要使用此工具,請將滑鼠停留在屬性上方,然後選取出現的釘選圖示,或按一下滑鼠右鍵,然後在產生的捷徑功能表中選取 [將成員釘選為我的最愛] 選項。 這會將該屬性提升到物件的屬性清單頂端,而屬性名稱和值會顯示在 [值] 資料行中。 若要取消釘選屬性,請再次選取釘選圖示,或在捷徑功能表中選取 [取消釘選成員為我的最愛] 選項。

Screenshot of Pin properties in the Watch window.

在監看式視窗中檢視物件的屬性清單時,您也可以切換屬性名稱並篩選出非釘選的屬性。 您可以選取監看式視窗上方工具列中的按鈕來存取這兩個選項。

重新整理監看值

評估運算式時,重新整理圖示 (圓形箭號) 可能會出現在 [監看式] 視窗中。 重新整理圖示表示錯誤或已過期的值。

若要重新整理值,請選取重新整理圖示或按下空格鍵。 偵錯工具會嘗試重新評估運算式。 不過,根據未評估值的原因,您可能不想要或能夠重新評估運算式。

將滑鼠暫留在重新整理圖示上,或查看 [值] 資料行,以了解運算式未評估的原因。 原因包括:

  • 當評估運算式時發生錯誤,如上一個範例所示。 可能會發生逾時,或變數可能超過範圍。

  • 運算式具有可在應用程式中觸發副作用的函式呼叫。 請參閱運算式副作用

  • 已停用屬性和隱含函式呼叫的自動評估。

如果重新整理圖示因為停用自動評估屬性和隱含函式呼叫而出現,您可以在 [工具]>[選項]>[偵錯]>[一般] 中選取[啟用屬性評估和其他隱含函式呼叫] 來啟用它。

若要示範如何使用重新整理圖示:

  1. [工具]>[選項]>[偵錯]>[一般] 中,清除 [啟用屬性評估和其他隱含函式呼叫] 核取方塊。

  2. 輸入下列程式碼,然後在 [監看式] 視窗中設定 list.Count 屬性的監看式。

    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        list.Add("hello");
        list.Add("goodbye");
    }
    
  3. 開始偵錯。 [監看式] 視窗會顯示類似下列訊息的內容:

    Screenshot of Refresh Watch.

    Screenshot of Refresh Watch.

  4. 若要重新整理值,請選取重新整理圖示或按下空格鍵。 偵錯工具會重新評估運算式。

運算式副作用

評估某些運算式可能會變更變數的值,或是影響應用程式的狀態。 例如,評估下列運算式會變更 var1的值:

var1 = var2

此程式碼可能會造成副作用。 副作用會變更應用程式運作的方式,導致偵錯更加困難。

具有副作用的運算式只會在您第一次輸入的時候評估一次。 之後,運算式會出現在 [監看式] 視窗中呈現灰色,並停用進一步的評估。 工具提示或 [值] 資料行說明運算式會造成副作用。 您可以選取值旁出現的重新整理圖示,以強制重新評估。

防止副作用指定的方法之一是關閉自動函式評估。 在 [工具]>[選項]>[偵錯]>[一般] 中,取消選取 [啟用屬性評估和其他隱含函式呼叫]

僅針對 C#,當關閉屬性評估或隱含函式呼叫時,您可以將 ac 格式修飾詞新增至 [監看式] 視窗中的變數 Name,以強制評估。 請參閱 Format specifiers in C# (C# 中的格式規範)。

在 [監看式] 視窗 (C# 和 Visual Basic) 中使用物件 ID

有時候您想要觀察特定物件的行為。 例如您可能想在區域變數已超出範圍之後,追蹤該變數參考的物件。 在 C# 和 Visual Basic 中,您可以針對參考型別的特定執行個體建立物件識別碼,並在 [監看式] 視窗和中斷點條件中加以使用。 物件識別碼由 Common Language Runtime (CLR) 偵錯服務產生,會與物件建立關聯。

注意

物件 ID 會建立弱式參考,不會防止記憶體回收物件。 它們僅針對目前的偵錯工作階段才有效。

在下列程式碼中 MakePerson() 方法會使用區域變數建立 Person

class Person
{
    public Person(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
}

public class Program
{
    static List<Person> _people = new List<Person>();
    public static void Main(string[] args)
    {
        MakePerson();
        DoSomething();
    }

    private static void MakePerson()
    {
        var p = new Person("Bob");
        _people.Add(p);
    }

    private static void DoSomething()
    {
        // more processing
         Console.WriteLine("done");
    }
}

若要了解 DoSomething() 方法中的 Person 名稱 ,您可以在 [監看式] 視窗中將參考新增至 Person 物件識別碼。

  1. Person 物件已建立之後,於程式碼中設定中斷點。

  2. 開始偵錯。

  3. 當執行暫停於中斷點時,選擇 [偵錯]>視窗>[區域變數] 來開啟 [區域變數] 視窗。

  4. [區域變數] 視窗中,以滑鼠右鍵按一下 Person 變數,然後選取 [建立物件識別碼]

    您應該會在 [區域變數] 視窗中看到貨幣符號 ($) 加上數字,也就是物件識別碼。

  5. 以滑鼠右鍵按一下 [物件識別碼],然後選取 [新增監看式],將物件識別碼新增至 [監看式] 視窗。

  6. DoSomething() 方法中設定另一個中斷點。

  7. 繼續偵錯。 在 DoSomething() 方法暫停執行時,[監看式] 視窗會顯示 Person 物件。

    注意

    如果您想要查看物件的屬性,例如 Person.Name,您必須選取 [工具]>[選項]>[偵錯]>[一般]>[啟用屬性評估和其他隱含函式呼叫] 來啟用屬性評估。

動態檢視和監看式視窗

某些指令碼語言 (例如 JavaScript 或 Python) 使用動態或 Duck 類型,以及在 .NET 4.0 版和更新版本支援在一般偵錯視窗中難以觀察的物件。

[監看式] 視窗會將這些物件顯示為動態物件,這些物件是從實作 IDynamicMetaObjectProvider 介面的型別建立的。 動態物件節點會顯示動態物件的動態成員,但不允許編輯成員值。

若要重新整理 [動態檢視] 值,請選取動態物件節點旁的 [重新整理圖示]

若要只顯示物件的 [動態檢視],請在 [監看式] 視窗中的動態物件名稱後面新增 [動態] 格式指定名稱:

  • 若為 C#:ObjectName, dynamic
  • 若為 Visual basic:$dynamic, ObjectName

注意

  • 當您逐步執行下一行程式碼時,C# 偵錯工具不會自動重新評估 [動態檢視] 中的值。
  • Visual Basic 偵錯工具會自動重新整理透過 [動態檢視] 新增的運算式。
  • 評估動態檢視的成員可能會有副作用

若要插入將物件強制型轉成動態物件的新監看式變數:

  1. 以滑鼠右鍵按一下 [動態檢視] 的任何子系。
  2. 選擇 [新增監看式]object.name 會 變成 ((dynamic) object).name,並出現在新的 [監看式] 視窗中。

偵錯工具也會將物件的 [動態檢視] 子節點新增至 [自動變數] 視窗。 若要開啟 [自動變數] 視窗,請在偵錯期間選取 [偵錯]>[視窗]>[自動變數]

[動態檢視] 也會強化 COM 物件的偵錯。 當偵錯工具取得包裝在 System.__ComObject中的 COM 物件時,它會為該物件新增 [動態檢視] 節點。

使用快速監看式觀察單一變數或運算式

您可以使用 [快速監看式] 來觀察單一變數。

例如,針對下列程式碼:

static void Main(string[] args)
{
    int a, b;
    a = 1;
    b = 2;
    for (int i = 0; i < 10; i++)
    {
        a = a + b;
    }
}

若要觀察 a 變數,

  1. a = a + b; 行上設定中斷點。

  2. 開始偵錯。 執行會在中斷點暫停。

  3. 選取程式碼中的變數 a

  4. 選取 [偵錯]>[快速監看式],按 Shift+F9,或以滑鼠右鍵按一下並選取 [快速監看式]

    [快速監看式] 對話方塊隨即出現。 a 變數位於 [運算式] 方塊中,1

    Screenshot of QuickWatch variable.

    Screenshot of QuickWatch variable.

  5. 若要使用變數評估運算式,請在 [運算式] 方塊中輸入運算式 (例如 a + b),然後選取 [重新評估]。

    Screenshot of QuickWatch expression.

    Screenshot of QuickWatch expression.

  6. 若要將變數或運算式從 [快速監看式] 新增至 [監看式] 視窗,請選取 [新增監看式]

  7. 選取 [關閉] 以關閉 [快速監看式] 視窗。 ([快速監看式] 是強制回應對話方塊,因此只要開啟,您就無法繼續偵錯。)

  8. 繼續偵錯。 您可以在 [監看式] 視窗中觀察變數。