共用方式為


中斷點:在 Visual Studio Debugger 中使用叫用次數、呼叫堆疊函式和條件,隨時隨地中斷執行

設定原始程式行、組譯碼指令和呼叫堆疊函式的中斷點。 指定條件、叫用次數和執行位置。 使用追蹤點列印。 儲存和匯入中斷點。

內容

Create breakpoints that break when you want

Set a breakpoint at a source line, assembly instruction, or call stack function

Access the advanced functionality of breakpoints

Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change

Print to the Output window with tracepoints

Manage breakpoints in the Breakpoints window

Troubleshoot breakpoints

Breakpoint Glyphs Reference

建立在您需要時中斷的中斷點

標準中斷點 (每次遇到原始程式檔位置時就會中斷偵錯工具執行) 是開發人員工具箱中最重要的偵錯技術之一。 Visual Studio 可協助您超越標準中斷點,讓您精細掌控中斷點執行的時機和位置。

  • 您可以設定執行階段中斷點,在您的程式返回呼叫堆疊上的函式時暫止執行,並且避免一連串冗長的 [跳離函式] 命令。

  • 如果您懷疑程式碼中的某個迴圈在經過特定數目的反覆項目之後開始出現行為異常,您可以設定中斷點,在遇到相關聯的程式碼行指定的次數之後停止執行,而不需強迫重複按 F5 ([偵錯]、[繼續]) 到達反覆項目層級。

  • 使用程式碼運算式可以指定中斷點中斷的確切條件。

您可以使用 [中斷點] 視窗來管理大量中斷點的狀態和行為。 如果您已仔細建構中斷點序列,用以診斷常見或特別複雜的問題,您可以使用 [中斷點] 視窗的匯入和匯出命令,儲存或共用這些中斷點。

警告

當您對混合模式 (原生和 Managed) 程式碼進行偵錯時,請避免在系統元件上設定中斷點。在混合模式偵錯進行當中,對系統元件設定中斷點可能會造成 Common Language Runtime 中斷,以及偵錯工具停止回應。

在原始程式行、組譯碼指令或呼叫堆疊函式設定中斷點

  • Set a breakpoint in a source file • Set a breakpoint at a function return in the Call Stack window • Set a breakpoint at an assembly instruction in the Disassembly window

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

有兩項技術可用來設定來源視窗中的標準中斷點:

  • 按兩下視窗巡覽邊中要中斷的那一行。

    -或-

  • 選取程式行並選擇 F9

[呼叫堆疊] 視窗內的中斷點

中斷點圖示會出現在巡覽邊中。

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

回到頁首 Set a breakpoint at a source line, assembly instruction, or call stack function

在呼叫堆疊視窗中的函式傳回處設定中斷點

您可以藉由在 [呼叫堆疊] 視窗中設定中斷點,在進行呼叫的函式返回的指令或程式行位置中斷執行。 偵錯工具必須處於中斷模式。

  • 開啟 [呼叫堆疊] 視窗 (快速鍵:Ctrl + Alt + C),並選取要中斷的呼叫函式位置。

  • 在內容功能表上選擇 [中斷點]、[插入中斷點],或是使用快速鍵:F9

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

[呼叫堆疊] 視窗內的中斷點

如果您開啟 [中斷點] 視窗 (快速鍵:Ctrl + Alt + B),這個中斷點會出現為位址中斷點,它具有對應於函式中下一個可執行指令的記憶體位置。 偵錯工具會在指令處中斷執行。

[中斷點] 視窗內的 [呼叫堆疊] 中斷點

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

在反組譯碼視窗中的組譯碼指令處設定中斷點

若要在組譯碼指令處設定中斷點,偵錯工具必須處於中斷模式。

  1. 開啟 [反組譯碼] 視窗 (快速鍵:Ctrl + Alt + D)。

  2. 執行下列任一步驟:

    1. 按兩下視窗巡覽邊中要中斷的那一行。

      -或-

    2. 選取程式行並選擇 F9

回到頁首 Set a breakpoint at a source line, assembly instruction, or call stack function

存取中斷點的進階功能

[中斷點] 內容功能表

在來源視窗、[呼叫堆疊] 視窗或 [反組譯碼] 視窗中,開啟中斷點的內容功能表並選擇屬性。

在 [中斷點] 視窗中,選取中斷點列並開啟內容功能表。 您也可以直接在條件欄中設定一些條件。

藉由叫用次數、運算式評估、執行位置或資料變更指定中斷點何時中斷

  • Specify a hit count at which the breakpoint executes • Specify a breakpoint condition using a code expression • Specify the devices, processes, or threads that a breakpoint executes on • Set a data change breakpoint (native C++ only)

指定中斷點執行的叫用次數

「叫用次數」(Hit Count) 會追蹤叫用中斷點的次數。 設定值和條件後,中斷點就會在叫用次數等於該值、等於所指定值的倍數,或是大於或等於該值時執行。 若要指定叫用次數和條件:

  1. 開啟 [叫用次數中斷點] 對話方塊。

    1. 在來源、[反組譯碼] 或 [呼叫堆疊] 中,選取包含中斷點的程式行,然後從內容功能表選擇 [中斷點]、[叫用次數]。

      -或-

    2. 在 [中斷點] 視窗中選取中斷點列,然後在內容功能表上選擇 [叫用次數]。

      [中斷點遇到次數] 對話方塊

  2. 選取條件並輸入叫用次數。

如果您要在特定反覆項目次數中斷進入迴圈,叫用次數條件會很實用。 如果您想要計算叫用中斷點的次數,但是不中斷執行,您也可以指定非常大的數字。

指定的叫用次數只會保留給偵錯工作階段。 當偵錯工作階段結束時,叫用次數就會重設為零。

回到頁首 Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change

使用程式碼運算式指定中斷點條件

「中斷點條件」(Breakpoint Condition) 是到達中斷點時,偵錯工具所要評估的運算式。 如果條件成立,偵錯工具就會中斷執行。

這個條件可以是偵錯工具所能辨識的任何有效運算式。 例如,在銀行程式中,您可以設定如 balance < 0 之類的中斷點條件。 如需有效運算式的詳細資訊,請參閱偵錯工具中的運算式

若要指定中斷點條件

  1. 開啟中斷點的內容功能表,然後選擇 [條件]。

  2. 在 [中斷點條件] 對話方塊的 [條件] 方塊中輸入有效的運算式。

  3. 如果想要在滿足運算式時中斷,請選擇 [為 true],如果想要在運算式的值變更時中斷,請選擇 [已變更]。

在第一次到達中斷點之前,偵錯工具不會評估運算式。 如果針對機器碼選擇 [已變更],偵錯工具不會將第一次條件評估視為變更,因此不會在第一次評估時叫用中斷點。 如果針對 Managed 程式碼選擇 [已變更],則會在選取 [已變更] 之後的第一次評估時叫用中斷點。

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

回到頁首 Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change

指定中斷點執行所在的裝置、處理序或執行緒

  1. 開啟中斷點的內容功能表並選擇 [篩選條件]。

    [中斷點篩選條件] 對話方塊

  2. 根據對話方塊指示指定篩選準則。

回到頁首 Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change

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

寫入儲存在特定記憶體位置的值時,資料中斷點會中斷執行。 如果值已讀取但未寫入,則不會中斷執行。 若要設定資料中斷點,偵錯工具必須處於中斷模式。

  1. 在 [偵錯] 功能表上選擇 [新增中斷點],然後選擇 [新增資料中斷點]。

    -或-

    在 [中斷點] 視窗功能表中選擇 [新增]、[新增資料中斷點]。

    資料中斷點視窗

  2. 在 [位址] 方塊中,輸入評估記憶體位址的記憶體位址或運算式。

    例如,輸入當變數 &avar 的內容變更時要中斷的 avar。

  3. 在 [位元組計數] 方塊中,輸入想要偵錯工具監看的位元組數量。

    例如,如果輸入 4,偵錯工具將會從 &myFunction 開始來監看四個位元組,並且在任何這些位元組的值變更時中斷。

若要設定資料中斷點,偵錯工具必須處於中斷模式。

下列情況不適用資料中斷點:

  • 如果未進行偵錯的處理序寫入記憶體位置

  • 如果記憶體位置在兩個或多個處理序之間共用。

  • 如果記憶體位置已在核心內更新。 例如,如果記憶體已傳遞至 32 位元的 Windows ReadFile 函式,記憶體將會從核心模式進行更新,而偵錯工具將不會在記憶體寫入時中斷。

偵錯工作階段之間的變數位址會有所不同。 因此,在每個偵錯工作階段的結尾會自動停用資料中斷點。

如果對區域變數設定資料中斷點,當函式結束時,資料中斷點會一直保持啟用狀態。 不過,其設定的記憶體位址不再具有相同意義。 因此,這類中斷點的結果是無法預期的。 如果對區域變數設定資料中斷點,最好的做法是在函式結束前移除或停用中斷點。

Visual Studio 支援每個方案最多四個資料中斷點。

回到頁首 Specify when a breakpoint breaks by hit count, expression evaluation, execution location, or data change

使用追蹤點列印至輸出視窗

「追蹤點」(Tracepoint) 是使用中斷點的另一種方式。 追蹤點是將訊息列印至 [輸出] 視窗的中斷點。 追蹤點在程式語言中的行為可以像是暫存追蹤陳述式。

若要在現有的中斷點列印訊息,請開啟中斷點的內容功能表,然後選擇 [叫用時]。

您可以在 [叫用中斷點時] 對話方塊中指定要列印的訊息。

[叫用中斷點時] 對話方塊

指定訊息

您可以使用 DebuggerDisplayAttribute 語法,在訊息中包含程式設計資訊 (請參閱 DebuggerDisplayAttribute)。 以下提供幾個範例:

  • In function '{$FUNC}', on thread '{$TID}'

  • Used variable: {varName}, function name: {functionName($FUNC)}

您可以使用 [叫用中斷點時] 對話方塊中描述的任何關鍵字。 此外,您也可以使用對話方塊中未顯示的其他兩個關鍵字:

  1. $TICK 會插入目前 CPU 的滴答計數

  2. $FILEPOS 會插入目前的檔案位置

指定追蹤點行為

若要在叫用追蹤點時中斷執行,請清除 [繼續執行] 核取方塊。 若已核取 [繼續執行] 時,則不會暫止執行。 在這兩種情況下,都會列印訊息。

停用追蹤點

若要暫時停用追蹤點,請清除 [列印訊息] 核取方塊。

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

  • Export and import breakpoints • Label breakpoints

[中斷點] 視窗中幾乎所有用來設定、配置及管理中斷點的功能,都會出現在來源視窗、[呼叫堆疊] 視窗和 [反組譯碼] 視窗中的個別中斷點位置。 但是,[中斷點] 視窗可讓您集中管理所有中斷點,這點在非常重視中斷點的大型方案或複雜的偵錯情節中非常有用。 如果您需要儲存或共用一組中斷點的狀態和位置,只能從 [中斷點] 視窗儲存和匯入中斷點檔案。

回到頁首 Manage breakpoints in the Breakpoints window

標記中斷點

中斷點標籤僅在 [中斷點] 視窗中用來排序和篩選中斷點清單。 若要將標籤加入至中斷點,請選擇中斷點列,然後選擇內容功能表上的 [標籤]。

進行中斷點疑難排解

  • The debugger can't determine the source file for a breakpoint • The debugger can't locate the correct version of the source file for a breakpoint • Breakpoints don't work in a DLL

偵錯工具無法判斷中斷點的原始程式檔

如果專案中兩個以上的原始程式檔有相同名稱,偵錯工具可能無法判斷哪個檔案中設定中斷點。 如果您建立的模組與您所連結之偵錯程式庫的元件是相同名稱,通常會發生這種情況。

若要解決這個問題,請在來源視窗中選取中斷點,並選擇內容功能表上的 [位置]。

[檔案中斷點] 對話方塊

在 [檔案] 方塊中輸入正確檔案的完整路徑

回到頁首 Troubleshoot breakpoints

偵錯工具找不到中斷點原始程式檔的正確版本

如果原始程式檔已變更,且來源不再符合您要偵錯的程式碼,則即使原始程式檔存在,偵錯工具可能仍會尋找對應中斷點的原始程式檔。

  1. 如果您要 Visual Studio 顯示不符合您要偵錯之版本的原始程式碼,請選擇 [偵錯]、[選項和設定]。 在 [偵錯]/[一般] 頁面上,清除 [只使用完全符合原始版本的原始程式碼] 選項。

  2. 您也可以將中斷點繫結至原始程式檔。 選取中斷點,並選擇內容功能表上的 [位置]。 在 [檔案中斷點] 對話方塊中核取 [允許原始程式碼與原始版本不同]。

回到頁首 Troubleshoot breakpoints

中斷點在 DLL 中無法運作

在偵錯工具尚未載入有關程式碼所在模組的偵錯資訊之前,您無法在原始程式檔中設定中斷點。 問題徵兆可能包含「無法設定中斷點」這類訊息。 警告中斷點圖像 (Glyph) 會出現在中斷點的位置。 不過,這些警告中斷點在程式碼載入時會成為實際的中斷點。

回到頁首 Troubleshoot breakpoints

中斷點圖像參考

原始檔視窗和 [反組譯碼] 視窗會在左邊界中顯示稱為「圖像」(Glyph) 的符號,以顯示中斷點位置。 下列表格描述這些圖像。

如果將滑鼠放在中斷點圖像上,便會顯示提供詳細資訊的中斷點秘訣。 這些資訊針對錯誤和警告中斷點特別有用。

圖像

描述

偵錯圖像 1

一般中斷點。 實心圖像表示已經啟用中斷點。 中空圖像表示已經停用中斷點。

偵錯圖像 2

進階中斷點。 使用中/停用。 加號 (+) 表示中斷點至少附加一個進階功能 (例如條件、叫用次數或篩選條件)。

偵錯圖像 3

對應的中斷點。 使用中/停用。 中斷點設定在 ASP/ASP.NET 程式碼中,並且對應到相對的 HTML 網頁上的中斷點,或設定在伺服器端指令碼檔案中,並且對應到客戶端指令碼檔案。

偵錯圖像 4

追蹤點。 使用中/停用。 叫用這個追蹤點會執行指定動作,但是不會中斷程式執行。

偵錯圖像 5

進階追蹤點。 使用中/停用。 加號 (+) 表示追蹤點至少附加一個進階功能 (例如條件、叫用次數或篩選條件)。

偵錯圖像 6

對應追蹤點。 使用中/停用。 追蹤點是設定在 ASP/ASP.NET 程式碼中,並且對應至相對應的 HTML 網頁追蹤點。

偵錯圖像 7

中斷點或追蹤點錯誤。 X 表示因為錯誤條件而無法設定中斷點或追蹤點。

偵錯圖像 8

中斷點或追蹤點警告。 驚嘆號表示因為暫時的狀況而無法設定中斷點或追蹤點。 通常,這表示尚未載入中斷點或追蹤點位置的程式碼。 如果您附加至處理序,但未載入處理序的符號,則也會看到這個警告。 載入程式碼或符號時,將會啟用中斷點然後變更圖像。

請參閱

概念

在 Visual Studio 中啟動、中斷、逐步執行、執行程式碼以及停止偵錯