在 Visual Studio 偵錯工具中使用中斷點

中斷點是開發人員工具箱中最重要的偵錯技術之一。 在您想要暫停偵錯工具執行的任何地方,設定中斷點。 例如,您可以在特定中斷點處查看程式碼變數的狀態,或查看呼叫堆疊。 如果您在使用中斷點時嘗試解決警告或問題,請參閱針對 Visual Studio 偵錯工具中的中斷點進行疑難排解

注意

如果您知道您嘗試解決的工作或問題,但您需要知道要使用的中斷點類型,請參閱常見問題集 - 尋找您的偵錯功能

在原始程式碼中設定中斷點

您可以在任何可執行程式碼行上設定中斷點。 例如,在下列 C# 程式碼中,您可以使用變數指派 (int testInt = 1)、for 迴圈,或 for 迴圈內的任何程式碼,在程式碼設定中斷點。 如果沒有指派且沒有 getter/setter,則無法在方法簽章、命名空間或類別的宣告,或變數宣告設定中斷點。

在原始程式碼中設定中斷點:

  • 按一下程式碼旁的左邊界。 您也可以選取該行,然後按 F9,選取 [偵錯]>[切換中斷點],或以滑鼠右鍵按一下並選取 [中斷點]>[插入中斷點]。 中斷點在左邊界中會以紅點顯示。

對於包括 C# 在內的大部分語言,會自動反白顯示中斷點和目前的執行行。 對於 C++ 程式碼,您可以選取 [工具] (或 [偵錯]) >[選項]>[偵錯]>[反白顯示中斷點的整個原始程式行及目前的陳述式 (僅限 C++)],來開啟中斷點和目前行的反白顯示。

Set a breakpoint

Set a breakpoint

當您偵錯時,執行會在中斷點 (在執行該行的程式碼之前) 暫停。 中斷點符號會顯示黃色箭號。

在下列範例中的中斷點處,testInt 的值仍然為 3。 值從變數初始化以來尚未變更 (設為 3 的值),因為黃色的陳述式尚未執行。

Breakpoint execution stopped

在下列範例中的中斷點,testInt 的值仍然為 1。 值從變數初始化以來尚未變更 (設為 1 的值),因為黃色的陳述式尚未執行。

Breakpoint execution stopped

當偵錯工具在中斷點處停止時,您可以查看應用程式的目前狀態,包括變數值呼叫堆疊

以下是一些使用中斷點的一般指示。

  • 中斷點是一個切換開關。 您可以按一下中斷點,按 F9 或使用 [偵錯]>[切換中斷點] 刪除或重新插入中斷點。

  • 若要停用中斷點而不刪除中斷點,請將滑鼠停留在上面或以滑鼠右鍵按一下它,然後選取 [停用中斷點]。 停用的中斷點在左邊界或 [中斷點] 視窗中會以空白點顯示。 若要重新啟用中斷點,請將滑鼠停留在上面或以滑鼠右鍵按一下它,然後選取 [啟用中斷點]

  • 設定條件和動作、新增和編輯標籤,或以滑鼠右鍵按一下中斷點並選取適當的命令,或將滑鼠停留在上面,然後選取 [設定] 圖示來匯出中斷點。

中斷點動作和追蹤點

「追蹤點」是將訊息列印至 [輸出] 視窗的中斷點。 追蹤點在程式設計語言中的行為可以像是暫時的追蹤陳述式,不會暫停程式碼的執行。 您可以在 [中斷點設定] 視窗中設定特殊動作,來建立追蹤點。 如需詳細指示,請參閱在 Visual Studio 偵錯工具中使用追蹤點

中斷點條件

您可以設定條件來控制中斷點執行的時機和位置。 條件可以是偵錯工具所能辨識的任何有效運算式。 如需有效運算式的詳細資訊,請參閱偵錯工具中的運算式

設定中斷點條件:

  1. 以滑鼠右鍵按一下中斷點符號並選取 [條件] (或按 Alt + F9C)。 或將滑鼠停留在中斷點符號上,選取 [設定] 圖示,然後在 [中斷點設定] 視窗中選取 [條件]。

    您也可以用滑鼠右鍵按一下程式碼旁的左邊界,然後從捷徑功能表中選取 [插入條件式中斷點] 來設定新的條件式中斷點。

    您也可以在 [中斷點] 視窗中以滑鼠右鍵按一下中斷點,選取 [設定],然後選取 [條件] 來設定條件

    Breakpoint settings

    Breakpoint settings

  2. 在下拉式清單中,選取 [條件運算式]、[叫用次數] 或 [篩選],並根據情況設定值。

  3. 選取 [關閉] 或按 Ctrl+Enter 關閉 [中斷點設定] 視窗。 或者,從 [中斷點] 視窗中,選取 [確定] 關閉對話方塊。

設定條件的中斷點在原始程式碼和 [中斷點] 視窗中會帶有 + 符號。

建立條件運算式

當您選取 [條件運算式] 時,就可以在兩個條件當中做選擇:[為 true] 或 [變更時]。 選擇 [為 true] 可在運算式滿足時中斷,選擇 [變更時] 可在運算式的值變更時中斷。

在下列範例中,中斷點只在 testInt 的值為 4 的時候才叫用:

Breakpoint condition is true

Breakpoint condition is true

在下列範例中,中斷點只在 testInt 的值變更時才叫用:

Breakpoint When changed

Breakpoint When changed

如果使用無效的語法設定中斷點條件,警告訊息便會出現。 如果使用有效的語法,但是無效的語意指定中斷點條件,在第一次叫用中斷點時,則會出現警告訊息。 在任一情況下,偵錯工具在叫用無效的中斷點時便會中斷。 只有在條件是有效的並且判斷值為 false時,才會略過中斷點。

注意

對於 [變更時] 欄位,偵錯工具不會將第一次評估條件視為變更,因此不會在第一次評估時就叫用中斷點。

在條件運算式中使用物件識別碼 (僅限 C# 和 F#)

有時候您想要觀察特定物件的行為。 例如,您可能想要找出物件為何多次插入集合中。 在 C# 和 F# 中,您可以針對參考類型的特定執行個體建立物件識別碼,並用於中斷點條件中。 物件 ID 是由 Common Language Runtime (CLR) 偵錯服務所產生並與物件相關聯。

建立物件識別碼:

  1. 物件建立之後,在程式碼中某個位置設定中斷點。

  2. 開始偵錯,當執行在中斷點處暫停時,選取 [偵錯]>[視窗]>[區域變數] (或按 Ctrl + Alt + VL) 開啟 [區域變數] 視窗。

    在 [區域變數] 視窗中尋找特定物件執行個體,以滑鼠右鍵按一下它,然後選取 [建立物件識別碼]

    您應該會看到 [區域變數] $ 視窗中顯示 $ 視窗。 這就是物件 ID。

  3. 在您要調查的位置加入新的中斷點,例如要將物件加入集合時。 以滑鼠右鍵按一下中斷點並選取 [條件]

  4. 使用 [條件運算式] 欄位中的物件識別碼。 例如,如果變數 item 是要加入集合的物件,請選取 [為 true],並輸入 item == $<n>,其中 <n> 是物件識別碼數字。

    要將該物件加入集合時,執行會在該處中斷。

    若要刪除物件識別碼,請以滑鼠右鍵按一下 [區域變數] 視窗中的變數,然後選取 [刪除物件識別碼]

注意

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

設定叫用次數條件

如果您懷疑程式碼中的某個迴圈在經過特定次數的反覆運算之後開始出現異常行為,您可以設定中斷點,在該叫用次數之後停止執行,不需重複按 F5 達到該反覆運算。

在 [中斷點設定] 視窗中的 [條件] 下,選取 [叫用次數],然後指定反覆運算次數。 在下列範例中,中斷點設定為每隔一個反覆運算叫用:

Breakpoint hit count

Breakpoint hit count

設定篩選條件

您可以限制只在指定的裝置上或指定的處理序和執行緒中引發中斷點。

在 [中斷點設定] 視窗中的 [條件] 下,選取 [篩選],然後輸入下列一或多個運算式:

  • MachineName = "名稱"
  • ProcessId = 值
  • ProcessName ="名稱"
  • ThreadId = 值
  • ThreadName = "名稱"

將字串值置於雙引號中。 您可以使用這些來結合子句: & (AND)、 || (OR)、 ! (NOT) 和括號。

設定函式中斷點

您可以在呼叫某個函式後中斷執行。 例如,當您知道函式名稱而非其位置時,這非常有用。 如果您有名稱相同的函式,而且想要在所有函式的位置中斷 (例如多載函式或不同專案中的函式),也會很有用。

設定函式中斷點:

  1. 選取 [偵錯]>[新增中斷點]>[函式中斷點],或按 Ctrl + KB

    您也可以在 [中斷點] 視窗中選取 [新增]>[函式中斷點]。

  2. 在 [新增函式中斷點] 對話方塊的 [函式名稱] 方塊中輸入函式名稱。

    縮小函式規格的範圍:

    • 使用完整函式名稱。

      範例: Namespace1.ClassX.MethodA()

    • 新增多載函式的參數類型。

      範例: MethodA(int, string)

    • 使用 '!' 符號指定模組。

      範例: App1.dll!MethodA

    • 在原生 C++ 中使用內容運算子。

      {function, , [module]} [+<line offset from start of method>]

      範例: {MethodA, , App1.dll}+2

  3. 在 [語言] 下拉式清單中,選擇函式的語言。

  4. 選取 [確定]。

使用記憶體位址設定函式中斷點 (僅限原生 C++)

您可以使用物件位址,在特定類別執行個體所呼叫的方法設定函式中斷點。 例如,如果提供類型為 my_class 的可定址物件,您可以在執行個體所呼叫的 my_method 方法設定函式中斷點。

  1. 在已具現化的類別執行個體後的某處設定中斷點。

  2. 尋找執行個體的位址 (例如 0xcccccccc)。

  3. 選取 [偵錯]>[新增中斷點]>[函式中斷點],或按 Ctrl + KB

  4. 在 [函式名稱] 方塊中加入下列內容,然後選取 [C++] 語言。

    ((my_class *) 0xcccccccc)->my_method
    

設定資料中斷點 (.NET Core 3.x 或 .NET 5+)

資料中斷點會在特定物件的屬性變更時中斷執行。

設定資料中斷點:

  1. 在 .NET Core 或 .NET 5+ 專案中,開始偵錯並等待到達中斷點。

  2. 在 [自動]、[監看式] 或 [區域變數] 視窗中,以滑鼠右鍵按一下屬性,然後在捷徑功能表中選取 [當值變更時中斷]

    Managed Data Breakpoint

.NET Core 和 .NET 5+ 的資料中斷點不適用於:

  • 無法在工具提示、區域變數、自動或監看式視窗中展開的屬性
  • 靜態變數
  • 具有 DebuggerTypeProxy 屬性的類別
  • 結構內的欄位

如需您可以設定的最大數目,請參閱資料中斷點硬體限制

設定資料中斷點 (僅限原生 C++)

資料中斷點會在儲存在指定記憶體位址的值變更時中斷執行。 如果值已讀取但未變更,則不會中斷執行。

設定資料中斷點:

  1. 在 C++ 專案中,開始偵錯,然後等到到達中斷點。 在 [偵錯] 功能表上選擇 [新增中斷點]>[資料中斷點]

    您也可以在 [中斷點] 視窗中選取 [新增]>[資料中斷點],或以滑鼠右鍵按一下 [自動]、[監看式] 或 [區域變數] 視窗中的項目,然後在捷徑功能表中選取 [當值變更時中斷]。

  2. 在 [位址] 方塊中,鍵入記憶體位址或評估為記憶體位址的運算式。 例如,輸入當變數 &avar 的內容變更時要中斷的 avar

  3. 在 [位元組計數] 下拉式清單中,選取想要偵錯工具監看的位元組數量。 例如,如果選取 4,則偵錯工具將從 &avar 開始監看四個位元組,並且在任何這些位元組的值變更時中斷。

資料中斷點在下列情況無法運作:

  • 未進行偵錯的處理序會寫入記憶體位置。
  • 記憶體位置會在兩個或多個處理序之間共用。
  • 記憶體位置已在核心內更新。 例如,如果記憶體已傳遞至 32 位元的 Windows ReadFile 函式,記憶體將會從核心模式進行更新,因此偵錯工具將不會在更新時中斷。
  • 監看式運算式在 32 位元硬體上大於 4 個位元組,在 64 位元硬體上大於 8 個位元組的情況。 這是 x86 架構的限制。

注意

  • 資料中斷點取決於特定的記憶體位址。 變數的位址在不同偵錯工作階段之間會變更,因此資料中斷點在每個偵錯工作階段結束時會自動停用。

  • 如果您對區域變數設定資料中斷點,則此中斷點在函式結束時會保持啟用狀態,但是此記憶體位址不再適用,因此該中斷點的行為無法預期。 如果對區域變數設定資料中斷點,您應該在函式結束前刪除或停用中斷點。

資料中斷點硬體限制

設定資料中斷點時,Windows 核心程序和基礎硬體有下列限制。 限制指的是您可以設定的資料中斷點數目上限。

處理器架構 資料中斷點限制
x64 和 x86 4
ARM64 2
ARM 1

設定相依中斷點

相依中斷點只會在另一個中斷點先叫用時才會中斷執行。 因此,在偵錯多執行緒應用程式這類複雜案例中,您可以在另一個中斷點先叫用之後設定其他中斷點。 這能讓在常見路徑 (例如遊戲迴圈或公用程式 API) 中偵錯程式碼變得更容易,因為這些函式中的中斷點可以設定為只有在從應用程式的特定部分叫用函式時才啟用。

設定相依中斷點:

  1. 將滑鼠停留在中斷點符號上,選擇 [設定] 圖示,然後在 [中斷點設定] 視窗中選取 [僅在叫用下列中斷點時才啟用]

  2. 在下拉式清單中,選取您希望目前中斷點相依的先決中斷點。

選擇 [關閉] 或按 Ctrl+Enter 關閉 [中斷點設定] 視窗。 或者,從 [中斷點] 視窗中,選擇 [確定] 關閉對話方塊。 Dependent Breakpoint

您也可以使用滑鼠右鍵捷徑功能表來設定相依中斷點。

  1. 以滑鼠右鍵按一下程式碼旁的左邊界,然後從捷徑功能表選取 [插入相依中斷點]

    Dependentbreakpoint context

  • 如果您的應用程式中只有單一中斷點,相依中斷點將無法運作。
  • 如果刪除先決中斷點,相依中斷點會轉換成一般行中斷點。

設定暫時中斷點

此中斷點可讓您只中斷程式碼一次。 偵錯時,Visual Studio 偵錯工具只會針對這個中斷點暫停執行中的應用程式一次,然後在叫用它之後立即移除它。

設定暫時中斷點:

  1. 將滑鼠停留在中斷點符號上,選擇 [設定] 圖示,然後在 [中斷點設定] 視窗中選取 [叫用後就移除中斷點]

  2. 選擇 [關閉] 或按 Ctrl+Enter 關閉 [中斷點設定] 視窗。 或者,從 [中斷點] 視窗中,選擇 [確定] 關閉對話方塊。

    Temporary breakpoint

您也可以使用滑鼠右鍵捷徑功能表來設定暫時中斷點。

  1. 以滑鼠右鍵按一下程式碼旁的左邊界,然後從捷徑功能表選取 [插入暫時中斷點]

    Temporary breakpoint context

或者,只要使用快速鍵 F9 + Shift + Alt、T,並在所需的行設定暫時中斷點。

在 [中斷點] 視窗中管理中斷點

您可以使用 [中斷點] 視窗查看和管理方案中所有的中斷點。 這個集中式位置在大型方案中,或對於中斷點很重要的複雜偵錯案例特別有用。

在 [中斷點] 視窗中,您可以搜尋、排序、篩選、啟用/停用或刪除中斷點。 您也可以設定條件和動作,或新增函式中斷點或資料中斷點。

若要開啟 [中斷點] 視窗,請選取 [偵錯]>[視窗]>[中斷點],或按 Ctrl+Alt+B

Breakpoints window

Breakpoints window

若要選取要在 [中斷點] 視窗中顯示的資料行,請選取 [顯示資料行]。 選取資料行標頭,依該資料行排序中斷點清單。

中斷點標籤

您可以在 [中斷點] 視窗中使用標籤來排序和篩選中斷點清單。

  1. 若要對中斷點新增標籤,請以滑鼠右鍵按一下原始程式碼或 [中斷點] 視窗中的中斷點,然後選取 [編輯標籤]。 新增標籤或選擇現有的標籤,然後選取 [確定]
  2. 在 [中斷點] 視窗中選取 [標籤]、[條件] 或其他資料行標頭,排序中斷點清單。 您可以在工具列中選取 [顯示資料行],選取要顯示的資料行。

匯出和匯入中斷點

若要儲存或共用中斷點的狀態和位置,您可以匯出或匯入中斷點。

  • 若要將單一中斷點匯出至 XML 檔案,請以滑鼠右鍵按一下原始程式碼或 [中斷點] 視窗中的中斷點,然後選取 [匯出] 或 [匯出已選取項目]。 選取匯出位置,然後選取 [儲存]。 預設位置為方案資料夾。
  • 若要匯出數個中斷點,請在 [中斷點] 視窗中,選取中斷點旁的方塊,或在 [搜尋] 欄位中輸入搜尋準則。 選取 [匯出符合目前搜尋準則的所有中斷點] 圖示,然後儲存檔案。
  • 若要匯出所有中斷點,請取消選取所有方塊,並將 [搜尋] 欄位保留空白。 選取 [匯出符合目前搜尋準則的所有中斷點] 圖示,然後儲存檔案。
  • 若要匯入中斷點,請在 [中斷點] 視窗中,選取 [從檔案匯入中斷點] 圖示,瀏覽至 XML 檔案位置,然後選取 [開啟]

從偵錯工具視窗設定中斷點

您也可以從 [呼叫堆疊] 和 [反組譯碼] 偵錯工具視窗設定中斷點。

在 [呼叫堆疊] 視窗中設定中斷點

若要在呼叫的函式返回的指令或程式行位置中斷,您可以在 [呼叫堆疊] 視窗中設定中斷點。

在 [呼叫堆疊] 視窗中設定中斷點:

  1. 若要開啟 [呼叫堆疊] 視窗,您必須在偵錯期間暫停。 選取 [偵錯]>[視窗]>[呼叫堆疊],或按 Ctrl+Alt+C

  2. 在 [呼叫堆疊] 視窗中,以滑鼠右鍵按一下呼叫函式,然後選取 [中斷點]>[插入中斷點],或按 F9

    中斷點符號會出現在呼叫堆疊的左邊界中,函式呼叫名稱旁邊。

呼叫堆疊中斷點在 [中斷點] 視窗中會以位址顯示,伴隨著對應於函式中下一個可執行指令的記憶體位置。

偵錯工具會在指令處中斷。

如需此呼叫堆疊的詳細資訊,請參閱如何:使用呼叫堆疊視窗

若要在程式碼執行期間以視覺化方式追蹤中斷點,請參閱進行偵錯時對應呼叫堆疊上的方法

在 [反組譯碼] 視窗中設定中斷點

  1. 若要開啟 [反組譯碼] 視窗,您必須在偵錯期間暫停。 選取 [偵錯]>[視窗]>[反組譯碼],或按 Ctrl+Alt+D

  2. 在 [反組譯碼] 視窗中,按一下您想要中斷的指令左邊界。 您也可以選取該指令,然後按 F9,或按一下滑鼠右鍵並選取 [中斷點]>[插入中斷點]