斷點告訴調試器應用程序應該在某個點中斷或暫停執行。當中斷發生時,程序和調試器被稱為處於中斷模式。跟蹤點是Visual Studio中的一個新調試器功能。跟蹤點是具有與其關聯的自定義操作的斷點。當命中跟蹤點時,調試器將執行指定的跟蹤點操作,而不是中斷程序執行。跟蹤點的一個常見用途是在程序到達某個點時打印消息。您可以將跟蹤點用於許多與使用跟蹤相同的目的,但無需修改代碼。另一個區別是,跟蹤點只在調試器下運行時工作。
斷點概述
斷點標志符號
源窗口和反匯編窗口通過在左邊距中顯示名為glyph的符號來顯示斷點位置。下表描述了這些標志符號。如果將鼠標放在斷點圖示符上,則會出現一個斷點提示,其中包含更多信息。此信息對於錯誤和警告斷點特別有用。
Glyph |
Description |
---|---|
![]() |
正常斷點。實心標志符號表示斷點已啟用。空心標志符號表示它已被禁用。 |
![]() |
高級斷點。激活/禁用。符號+表示斷點至少附加了一個高級功能(如條件、命中計數或篩選器)。 |
![]() |
映射斷點。激活/禁用。斷點在ASP/ASP.NET代碼中設置並映射到相應HTML頁面中的斷點,或者在服務器端腳本文件中設置並映射到相應的客戶端腳本文件。 |
![]() |
追蹤點。激活/禁用。達到此點將執行指定的操作,但不會中斷程序執行。 |
![]() |
高級跟蹤點。激活/禁用。符號+表示跟蹤點至少附加了一個高級功能(如條件、命中計數或篩選器)。 |
![]() |
映射跟蹤點。激活/禁用。跟蹤點在ASP/ASP.NET代碼中設置,並映射到相應HTML頁面中的跟蹤點。 |
![]() |
斷點或跟蹤點錯誤。X表示由於錯誤條件,無法設置斷點或跟蹤點。 |
![]() |
斷點或跟蹤點警告。感嘆號表示由於臨時條件,無法設置斷點或跟蹤點。通常,這意味着斷點或跟蹤點位置的代碼尚未加載。如果附加到進程並且未加載該進程的符號,則也可以看到。加載代碼或符號時,將啟用斷點並更改圖示符 |
基本斷點
最基本的斷點是在源代碼行或函數上設置的斷點。注意:如果一個源文件中有超過64000行代碼,則不會命中64000行之后的行上的斷點。
一行上有多個斷點
有時,一行代碼包含多個可執行語句。在這種情況下,可以在行上設置多個斷點。包含當前選定斷點的代碼語句周圍將出現一個框。此框可用於區分同一行代碼上的多個斷點。可以在“斷點”窗口中選擇斷點,也可以單擊“源”窗口中包含斷點的語句。
高級斷點
如果您有VisualC++或VisualStudio,任何版本,您可以設置更高級的斷點,創建具有高級特性的斷點,並以更強大的方式使用斷點。
內存地址和內存更改上的斷點
可以在內存地址上設置斷點,也就是地址斷點。在C/C++中,可以設置一個在內存更改時命中的斷點,也就是數據斷點(僅限本機)。
篩選、命中計數和條件
過濾器、命中計數和條件是可以附加到任何類型斷點(包括跟蹤點)的高級功能。
- 篩選器導致在指定的計算機、進程和線程上設置斷點。在調試運行在多個處理器上的應用程序時,篩選器非常有用。
- 命中計數跟蹤斷點被命中的次數。默認情況下,斷點在每次被命中時都會中斷執行。您可以更改此行為,以便只有當命中計數等於或超過指定值或命中計數是給定值的倍數時,斷點才會斷開。指定的命中計數僅為調試會話保留。
- 條件是一個表達式,計算該表達式以確定斷點是否將斷開。
斷點限制
在調試混合模式、本機和托管代碼時,請避免在系統組件上設置斷點。在混合模式調試期間在系統組件上設置斷點可能會導致公共語言運行庫中斷,調試器停止響應。除非您單步執行調用,否則調試器不會自動附加到XML Web服務。這意味着在XML Web服務中設置的任何斷點都不會被命中,除非您進入調用。如果嘗試使用“開始調試”或“繼續”來運行斷點,而不是使用“單步執行”,則不會命中斷點。
設置簡單斷點
Visual Studio調試器提供了許多設置斷點的方法。下面提供了兩種設置簡單斷點的快速方法。
- 在快捷菜單上設置簡單斷點
在源窗口中,右鍵單擊要設置斷點的可執行代碼行。在快捷菜單上,單擊“斷點”,然后單擊“插入斷點”。 - 在“調試”菜單上設置簡單斷點
在源窗口中,單擊要設置斷點的可執行代碼行。在“調試”菜單上,單擊“切換斷點”。
設置地址斷點
可以在“反匯編”窗口中的內存地址處設置斷點。設置斷點后,可以在“斷點”窗口中編輯地址斷點。先轉到匯編窗口,然后進行下面的操作:
在“反匯編”窗口中,單擊一行代碼,然后單擊“調試”菜單上的“切換斷點”。
-或者-
右鍵單擊一行代碼,然后選擇“插入斷點”。
設置函數斷點
可以在函數的開頭或函數中的指定位置設置斷點。對於腳本,只能在函數的開頭設置斷點。
- 插入函數斷點
(可選)在源窗口中,單擊函數的名稱。這會將函數的名稱插入到“新建斷點”對話框中,以便您不必鍵入它。
在“調試”菜單上,指向“新建斷點”,然后單擊“函數斷點”。
出現“新建斷點”對話框。
如果“函數”文本框不顯示要設置斷點的函數的名稱,請在“函數”框中鍵入函數名稱,並確保“語言”下拉列表顯示該函數的正確編程語言。如果函數未重載,則只需要函數名。對於重載函數,可以指定參數以正確設置斷點。鍵入函數名,后跟括在括號中的參數類型名。例如,對於一個名為a的C#方法,它接受一個帶字符串參數和int參數,請鍵入a(int,string)。
在本機C++中,可以使用上下文運算符。(僅限Visual Basic和C)如果希望Visual Studio Intellisense驗證輸入的函數名,請選中“使用Intellisense驗證函數名”復選框。
如果選中該復選框,並且鍵入的內容與重載簽名不匹配,則會出現“選擇斷點”對話框,您可以選擇要放入斷點的重載。如果未選中該復選框並鍵入函數名,則斷點將放入所有重載中。如果未選中該復選框,並且鍵入的簽名不匹配,則不會在代碼中插入斷點。
斷點設置在函數的開頭。如果要在函數中的其他位置設置斷點,請更改“行”和“字符”框中的值。
單擊“確定”。 - 從“斷點”窗口插入函數斷點
后面的操作跟上面一樣。
從調用堆棧窗口設置函數調用的斷點
此功能不適用於Transact-SQL、Internet Explorer中的腳本或ASP。本主題描述如何使用調用堆棧窗口在對函數的特定調用上設置斷點。斷點在函數調用中的下一個可執行指令處設置。如果要在函數本身上設置斷點,而不是在對函數的特定調用上設置斷點。
在“調用堆棧”窗口中,在中斷模式下,右鍵單擊函數調用,然后單擊快捷菜單(斷點子菜單)上的“插入斷點”。斷點符號出現在函數調用名稱旁邊的左邊距中。查看斷點屬性時,此斷點顯示為地址斷點,其內存位置與函數中的下一個可執行指令相對應。
設置數據斷點(Native Only)
Visual Studio支持每個解決方案最多四個數據斷點。
- 在“調試”菜單上,選擇“新建斷點”,然后單擊“新建數據斷點”。
-或者-
在“斷點”窗口菜單中,單擊“新建”,然后選擇“新建數據斷點”。 - 出現“新建斷點”對話框。在“地址”框中,鍵入計算結果為內存地址的內存地址或表達式。例如,鍵入&avar以在變量avar的內容更改時中斷。
- 在“字節計數”框中,鍵入希望調試器監視的字節數。例如,如果鍵入4,調試器將監視從&myFunction開始的四個字節,如果這些字節中的任何一個改變了值,調試器將中斷這些字節。
- 單擊“確定”。
刪除斷點
在源窗口、反匯編窗口或調用堆棧窗口中,斷點顯示為紅色符號或標志符號。
刪除一個斷點
在“斷點”窗口中,右鍵單擊斷點,然后單擊快捷菜單上的“刪除”。
-或者-
在源窗口或反匯編窗口中,單擊斷點圖示符。
刪除所有斷點
在“調試”菜單中,單擊“刪除所有斷點”。
啟用或禁用斷點
啟用或禁用一個斷點
在“源”、“反匯編”或“調用堆棧”窗口中,右鍵單擊包含斷點標志符號的行,指向“斷點”,然后單擊“啟用斷點”或“禁用斷點”。
-或者-
在“斷點”窗口中,選中或清除斷點旁邊的復選框。
啟用或禁用多個斷點
在“調試”菜單中,單擊“啟用所有斷點”。
編輯斷點位置
- 在“斷點”窗口中,右鍵單擊斷點,然后單擊快捷菜單上的“位置”。
-或者-
在“源”、“反匯編”或“調用堆棧”窗口中,右鍵單擊包含斷點圖示符的行,然后在快捷菜單上單擊“從斷點定位”。
在源窗口中,可能必須右鍵單擊設置斷點的確切字符。如果斷點設置在源代碼行內的特定字符上,則這是必需的。 - 對於文件斷點,編輯文件以更改設置斷點的文件,編輯行以更改文件中的行號,或編輯字符以更改該行上的水平位置。
默認情況下,只有設置斷點的源文件版本與可執行文件的編譯源文件完全匹配時,才會命中文件斷點。若要更改此默認值,請清除“一般調試選項”對話框中的“要求源文件與原始版本完全匹配”。
-或者-
對於地址斷點,請編輯address以更改設置斷點的內存位置,或編輯Language以更改調試器計算地址框中表達式的語法。
-或者-
對於函數斷點,編輯函數更改設置斷點的函數的簽名,編輯行更改函數中的行號,或編輯字符更改該行上的水平位置。
如果希望Visual Studio Intellisense檢查輸入的函數名的有效性,請選中“使用Intellisense驗證函數名”。
-或者-
對於數據斷點,編輯地址以更改要監視的內存位置,或編輯字節計數以更改要監視的字節數。
指定斷點條件
- 在“斷點”窗口中,右鍵單擊包含斷點圖示符的行,然后單擊快捷菜單上的“設置”。
-或者-
在源、反匯編或調用堆棧中,右鍵單擊包含斷點標志符號的行,然后單擊快捷菜單上的“斷點條件”。 - 在“斷點條件”對話框中,在“條件”框中輸入有效表達式,例如myLocalVariable>1。
- 如果要在滿足表達式時斷開,則選擇為true;如果要在表達式值更改時斷開,則選擇已更改。
在第一次到達斷點之前,調試器不會計算表達式。如果為本機代碼選擇“已更改”,則調試器不會將條件的第一次求值視為更改,因此不會在表達式的第一次求值時命中斷點。如果為托管代碼選擇“已更改”,則在選擇“已更改”后的第一次求值時將命中斷點。
指定命中次數
命中計數跟蹤斷點被命中的次數。默認情況下,每次遇到斷點時執行都會中斷。您可以選擇:
- 始終中斷(默認設置)。
- 當命中計數等於指定值時中斷。
- 當命中數等於指定值的倍數時中斷。
- 當命中數大於或等於指定值時中斷。
如果要跟蹤斷點被命中但從不中斷執行的次數,可以將命中計數設置為非常高的值,以便從不命中斷點。指定的命中計數僅為調試會話保留。調試會話結束時,命中計數重置為零。
- 在“斷點”窗口中,右鍵單擊斷點,然后單擊快捷菜單上的“命中計數”。
-或者-
在“源”、“反匯編”或“調用堆棧”窗口中,右鍵單擊包含斷點的行,然后從快捷菜單上的“斷點”子菜單中單擊“命中計數”。 - 在“命中計數”對話框中,從“斷點命中時”列表中選擇所需的行為。如果選擇了“始終中斷”以外的任何設置,則列表旁邊會顯示一個文本框。編輯文本框中顯示的整數以設置所需的命中計數。
- 點擊OK.
指定斷點篩選器
斷點篩選器將斷點的行為限制為指定的計算機、進程和線程。當調試分布在多個處理器上的並行應用程序時,斷點篩選器可能很有用。
- 在“斷點”窗口中,右鍵單擊斷點,然后單擊快捷菜單上的“篩選”。-或者-在源、反匯編或調用堆棧中,右鍵單擊包含斷點標志符號的行,然后在快捷菜單上選擇“從斷點篩選”。在“斷點篩選器”對話框中,使用“篩選器”框按名稱和進程指定計算機,或按名稱或ID號指定線程。
- 單擊OK
指定跟蹤點/斷點操作
跟蹤點是一種使用斷點的新方法。跟蹤點是具有與其關聯的自定義操作的斷點。當跟蹤點被命中時,它會導致調試器執行指定的操作,而不是(或除此之外)中斷程序執行。您可以用兩種不同的方式創建跟蹤點:
- 通過添加跟蹤點操作,可以將現有斷點轉換為跟蹤點。任何類型的斷點都可以轉換為跟蹤點。
- 可以使用New tracepoint命令從頭創建跟蹤點。
從頭開始創建跟蹤點
在源窗口中,單擊要設置跟蹤點的行,然后在快捷菜單上選擇“插入跟蹤點”。
“命中時”對話框出現。它包含兩個文本框,您可以在其中輸入自定義操作:打印消息和運行宏。
此時,您可以接受預選的跟蹤點設置,或按如下方式修改它們:
要創建將消息打印到輸出窗口的跟蹤點,請選擇打印消息並在相應的文本框中輸入消息文本。通過使用打印消息,可以將跟蹤點用於與使用跟蹤類相同的目的,但無需修改代碼。
可以使用DebuggerDisplayAttribute語法包含編程信息。例如:
在函數{$FUNC}中,在線程{$TID}上
-或者-
使用的變量:{varName},函數名:{function name($FUNC)}
您可以使用“命中斷點時”對話框中顯示的任何關鍵字。此外,還可以使用對話框中未顯示的其他兩個關鍵字:$TICK插入當前CPU計時計數,而$FILEPOS插入當前文件位置。當“命中斷點時”對話框打開時,“打印消息”中將顯示默認消息。如果要接受此消息,請單擊“確定”。要運行Visual Studio自動化模型宏,請選擇“運行宏”,然后從下拉列表中選擇宏。當您選擇打印消息或運行宏時,“繼續執行”復選框將變為活動狀態。如果不希望跟蹤點中斷程序的執行,請選擇“繼續執行”。
從現有斷點創建跟蹤點
在“源”、“反匯編”或“調用堆棧”窗口中,右鍵單擊斷點標志符號並選擇“操作”。
-或者-
在“斷點”窗口中,右鍵單擊斷點圖示符並選擇“設置”。
對話框出現。
斷點失敗
如果項目中的兩個或多個源文件具有相同的名稱,則調試器可能無法確定斷點設置在哪個文件中。如果創建的模塊與要鏈接的調試庫的組件同名,則通常會發生這種情況。要解決此問題,請輸入源文件的完整路徑。可以在“文件斷點”對話框中更改文件路徑名。在其他情況下,調試器可能找不到對應於斷點的源文件,即使源文件存在。如果源文件已更改,並且源與正在調試的代碼不再匹配,則會發生這種情況。如果希望Visual Studio顯示與正在調試的版本不匹配的源代碼,請在“選項”對話框的“常規”類別的“調試”節點中清除“僅使用與原始版本完全匹配的源代碼”選項。也可以通過選中“文件斷點”對話框中的“允許源代碼與原始版本不同”來綁定斷點。