啟動、中斷、巡覽和停止 Visual Studio 偵錯工具

本主題內容

本主題內容

啟動偵錯

  • 要處理的附加

  • 自動在偵錯工具中啟動應用程式

巡覽程式碼在偵錯工作階段。

  • 使用中斷點的插入程式碼或中斷所有

  • 逐步執行,在中,或在程式碼外部

  • 執行至指定位置或函式

  • 設定下一個要執行的陳述式。

  • 逐步執行至 Just My Code 的 Restrict

  • 逐步執行系統呼叫。

  • 逐步執行屬性及運算子在 Managed 程式碼

停止偵錯

啟動偵錯

當您的方案開啟時是 Visual Studio,您可以啟動三個索引偵錯:

選取 [偵錯], [啟動偵錯] (鍵盤: F5)。

應用程式會啟動並執行直到:

  • 偵錯工具到達中斷點。

  • 在 [偵錯] 功能表上的 [停止偵錯] 。

  • 擲回例外狀況。

  • 結束應用程式。

選取 [偵錯], [逐步執行] (鍵盤: F11) 或 [偵錯], [步驟] (鍵盤: F10)。

您的應用程式啟動之後中斷於第一行。

在來源視窗中,選取可執行的程式碼行並選取內容功能表上的 [執行至游標處。] 。

您的應用程式會啟動並執行,直到到達中斷點或游標位置, (兩者取其先)。

y740d9d3.collapse_all(zh-tw,VS.110).gif要處理的附加

偵錯工具也可以附加至 Visual Studio 中管理外部執行的程式。 在您附加至程式後,您可以使用偵錯工具執行命令,檢查程式狀態,等等。 您可以檢查程式可能會有所限制,根據程式是否建立了以偵錯資訊,以及是否可以存取程式的原始程式碼的,因此, Common Language Runtime JIT 編譯器是否追蹤偵錯資訊。

附加至本機電腦上執行的處理序

選取 [偵錯]],則 [附加處理]。 在 [附加處理] 對話方塊中,選取處理序從 [可使用的處理序] 清單,然後選取 [附加]。

[附加至處理序] 對話方塊

如需詳細資訊,請參閱 附加至執行中處理序

y740d9d3.collapse_all(zh-tw,VS.110).gif自動在偵錯工具中啟動應用程式

有時候,您可能需要針對由其他處理序啟動的應用程式,偵錯啟始程式碼 (Startup Code)。 這類範例包括了服務和自訂安裝動作。 在這些案例中,您可以讓偵錯工具在應用程式啟動時啟動並自動附加。

  1. 啟動登錄編輯程式 (regedit.exe)。

  2. 為 [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File 執行選項] 資料夾。

  3. 選取您在偵錯工具要啟動應用程式的資料夾。

    如果應用程式的名稱未列為子資料夾中選取 [影像檔執行選項] ],然後選取 [新增],在捷徑功能表上的 [索引鍵] 。 選取新的金鑰,然後選擇捷徑功能表上的 [重新命名] ],然後輸入應用程式的名稱。

  4. 在應用程式資料夾的捷徑功能表上,選擇 [新增]],則 [字串值]。

  5. New Value 將新值的名稱變更為 偵錯工具。

  6. 在偵錯工具項目的捷徑功能表上,選擇 [修改]。

  7. 在編輯字串對話方塊中,於 [數值資料。] 方塊中輸入 vsjitdebugger.exe 。

    [編輯字串] 對話方塊

regedit.exe 中的自動偵錯工具起始項目

本主題內容

巡覽程式碼在偵錯工作階段。

y740d9d3.collapse_all(zh-tw,VS.110).gif使用中斷點的插入程式碼或中斷所有

當您偵錯與 Visual Studio 偵錯工具的應用程式時,應用程式可能為執行中或在中斷模式中。

偵錯工具中斷應用程式的執行,當執行程序到達中斷點時,或當例外狀況發生時。 您可以手動中斷執行一次。

中斷點會通知偵錯工具暫停應用程式執行某一點的信號。 當執行暫止於中斷點時,程式將處於中斷模式下。 進入中斷模式並不會停止或結束程式的執行,隨時都可以繼續執行。

大多數的偵錯工具功能,例如檢視在區域變數視窗中的變數值或評估監看式視窗中的運算式,只適用於中斷模式。 您的應用程式中的所有項目保持 (例如函式、變數及物件都會留在記憶體中,),不過,這些項目的移動,並且活動逾時。 在中斷模式下,您可以檢查項目的位置和狀態,以尋找違規或錯誤。 您也可以設定為應用程式,在中斷模式中

您可以設定中斷點暫停根據一些狀況下的執行。 請參閱 使用中斷點和追蹤點。 本節將說明兩種基本方法要插入程式碼。

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

若要設定簡單的中斷點在您的程式碼,請在 Visual Studio 編輯器的原始程式檔。 將游標放在您要中斷的程式碼,然後選取 [中斷點],在內容功能表上的 [插入中斷點。] (快速鍵: F9。 在行之前的偵錯工具中斷執行。

設定中斷點

在 Visual Studio 的中斷點提供相當豐富的其他功能,例如條件式中斷點和追蹤點。 請參閱 使用中斷點和追蹤點

手動插入程式碼

要插入程式碼中可用資料行在執行的應用程式中,選取 [偵錯], [中斷所有] (鍵盤: Ctrl+Alt+Break)。

  • 如果您正在偵錯使用 Just My Code 啟用選項,您中斷在專案的下一行程式碼。 請參閱 Restrict stepping to Just My Code

  • 如果您正在偵錯多個程式,根據預設,中斷點或 [全部中斷] 命令就會影響正在偵錯的所有程式。 請參閱本主題稍後的 Change the break behavior of multiple processes

  • 如果您中斷,當執行程式碼,但沒有對應的來源或符號 (.pdf) 檔),偵錯工具顯示可協助您找出適當的檔案的 [原始程式檔找不到] 或 [符號找不到] 頁面。 請參閱 尋找符號 (.pdb)、來源和二進位檔案

    如果您無法存取的支援檔案,您可以偵錯仍在反組譯碼視窗的組譯碼指令。

y740d9d3.collapse_all(zh-tw,VS.110).gif逐步執行,在中,或在程式碼外部

最常見的一種偵錯程序是「逐步執行」(Stepping)。 逐步執行就是一次執行一行程式碼。 當您停止執行,例如執行偵錯工具的中斷點時,您可以使用三種 [偵錯] 命令逐步執行程式碼:

功能表命令

鍵盤快速鍵

描述

逐步執行

F11

如果下一行程式碼中有函式呼叫,[逐步執行] 只執行呼叫本身,並在函式內的第一行程式碼中止。 否則, [逐步執行] 會執行下一個陳述式。

不進入函式

F10

如果行包含函式呼叫, [步驟] 會執行呼叫的函式,則並在呼叫的函式內的第一個程式碼。 否則, [逐步執行] 會執行下一個陳述式。

跳離函式

Shift+F11

[跳離函式] 會繼續執行程式碼直到函式返回,然後在呼叫函式中的返回點上中斷。

  • [逐步執行] 會在巢狀函式呼叫中逐步執行最深的巢狀函式。 如果您在類似 Func1(Func2()) 的呼叫中使用 [逐步執行],偵錯工具就會逐步執行函式 Func2。

  • 偵錯工具逐步執行程式碼陳述式實際執行而不是實際資料。 例如 if 子句中某一行可以撰寫:

    int x = 42;
    string s = "Not answered";
    if( int x == 42) s = "Answered!";
    
    Dim x As Integet = 42
    Dim s As String = "Not answered"
    If x = 42 Then s = "Answered!"
    

    當您逐步執行這一行時,偵錯工具會將條件為步驟和這種結果為類別 (在此範例中,條件是 true)。

y740d9d3.collapse_all(zh-tw,VS.110).gif執行至指定位置或函式

有時候您會想要執行到某一程式碼,然後暫停執行。 如果您將中斷點設定在想要中斷的位置,請選取 [偵錯]、 [啟動偵錯] ],如果未啟動偵錯,或者, [繼續] 或 [偵錯]。 (在這兩種情況下 F5 是快速鍵)。 偵錯工具不會在程式碼執行的下一個中斷點。 選取 [偵錯], [繼續] ],直到您到達您想要的中斷點。 請參閱本主題稍後的 Set breakpoints in the code

您也可以執行到您在程式碼編輯器的地方放置游標,或執行至指定的函式。

執行至游標位置。

若要執行至游標位置,請將游標置於可執行的程式碼在來源視窗中。 在編輯器的內容功能表上,選擇 [執行至游標處。]。

若要在呼叫堆疊上的函式

在 [呼叫堆疊] 視窗中,選取函式,然後從內容功能表選取 [執行至游標處。] 。

若要依名稱指定的函式

您可以命令偵錯工具執行應用程式直至指定的函式。 您可以依名稱來指定函式或是在呼叫堆疊中選取它。

依名稱來指定函式,選取 [偵錯]],則 [新中斷點], [在函式中斷]],然後輸入函式和其他識別資訊的名稱。

[新增中斷點] 對話方塊

如果函式是多載或在多個命名空間,您可以選擇要在 [選取中斷點] 對話方塊中想要的函式。

[選擇中斷點] 對話方塊

y740d9d3.collapse_all(zh-tw,VS.110).gif設定下一個要執行的陳述式。

在您中斷偵錯工具,您可以移動執行點設定要執行後的程式碼中的下一個陳述式。 來源或 [反組譯碼] 視窗邊界中的黃色箭頭,將會標記出下一個要執行的陳述式之位置。 您可以移動這個箭頭以略過一部分的程式碼或是返回先前執行的行。 可以在某些情形中使用這項功能,例如略過包含已知錯誤的程式碼區段。

Example2

設定下一個要執行的陳述式。,使用下列其中一項程序:

  • 在來源視窗中,將拖曳黃色箭號到您要在同一個原始程式檔中的下一個陳述式的位置

  • 在來源視窗中,將該行的游標要執行之下選取內容功能表上的 [設定下一個陳述式] 。

  • 在反組譯碼視窗,請將組件指令的游標要執行之下選取內容功能表上的 [設定下一個陳述式] 。

警告

設定下一個陳述式會導致程式計數器直接跳至新的位置。使用這個命令時請務必要注意:

  • 不會執行舊與新執行點之間的指令

  • 如果將執行點向後移,並不會復原中間的指令

  • 將下一個陳述式移至其他函式或範圍通常會造成呼叫堆疊損毀,導致執行階段錯誤或例外狀況。如果嘗試將下一個陳述式移至其他範圍,偵錯工具會開啟警告對話方塊,讓您有機會取消作業。在 Visual Basic,您無法將下一個陳述式移至其他範圍或函式

  • 在原生 C++ 中,因此,如果您有執行階段檢查允許,設定下一個陳述式可能造成例外狀況擲回時,執行到方法的結尾時。

  • 啟用編輯後繼續時, [設定下一個陳述式] 會失敗,如果您做了編輯後繼續無法立即重新對應的編輯。舉例來說,如果您編輯了 catch 區塊內的程式碼,就會發生這種情況。發生這種情況。您會告訴您的錯誤訊息不支援此作業。

注意事項注意事項

在 Managed 程式碼中,您無法在下列情況中移動下一個陳述式:

  • 下一個陳述式是在與目前陳述式不同的方法中

  • 使用 Just-In-Time 偵錯啟動偵錯。

  • 呼叫堆疊回溯進行中

  • 擲回 System.StackOverflowException 或 System.Threading.ThreadAbortException 例外狀況

應用程式正在執行時,不能設定下一個陳述式。 若要設定下一個陳述式,偵錯工具必須處於中斷模式下。

y740d9d3.collapse_all(zh-tw,VS.110).gif逐步執行至 Just My Code 的 Restrict

有時候在偵錯時,您可能只想查看自己所撰寫的程式碼,並且忽略像是系統呼叫等其他程式碼。 您可以使用 Just My Code 偵錯來達到目的。 Just My Code 會隱藏非使用者的程式碼,使此程式碼不會出現在偵錯工具視窗中。 在逐步執行時,偵錯工具會逐步執行任何非使用者的程式碼,但是不會中途停止。

若要啟用或停用 Just My Code 偵錯,請選取 [偵錯]],則 [選項和設定]。 在 [偵錯] 中, [ [概觀] 頁面上,選取或清除 [啟用 Just My Code]。

與非使用者程式碼要區別使用者程式碼, Just My Code 會查看符號 (PDB) 檔案和最佳化程式。

在標準偵錯組建中,會關閉最佳化並且建立所有模組的偵錯符號。 當您執行偵錯組建時,這些模組會被視為使用者程式碼。 但是,最佳化並且沒有偵錯符號的程式庫函式不會被視為使用者程式碼。 Just My Code 讓執行不會在程式庫程式碼中的中斷點停止,因為程式庫程式碼通常不是您想偵錯的程式碼。 在 [中斷點] 視窗中,這些中斷點會與 [停用的中斷點] 圖示一起出現。

若要查看所有程式碼並在所有中斷點停止,您可以關閉 Just My Code 偵錯使用 [選項] 對話方塊。

偵錯工具在考慮何謂 My Code 時還受到三個屬性影響:DebuggerNonUserCodeAttribute 會告知偵錯工具它所套用的程式碼並不是 My Code。 DebuggerHiddenAttribute 會對偵錯工具隱藏程式碼,即使 Just My Code 已關閉。 DebuggerStepThroughAttribute 會告知偵錯工具應逐步執行 (Step Through) 它所套用的程式碼,而非逐步執行 (Step Into) 程式碼。

當 Just My Code 啟用時,您可以選取 [偵錯] 功能表上的 [中斷所有] 並在未顯示的 My Code 的位置停止執行。 發生該狀況時,不會顯示任何程式碼。 此外,如果選擇 [步驟] 命令,它會執行到 My Code 的下一行。

程式設計中斷陳述式 (如 Visual Basic Stop 陳述式) 的處理方式不同。 即使啟用 Just My Code,偵錯工具還是會在這些陳述式中斷。 遇到這種狀況時,非使用者程式碼不會隱藏,而會顯示出來,但逐步執行會帶您離開非使用者程式碼,執行到 My Code 的下一行。

注意事項注意事項

裝置專案不支援 Just My Code。

y740d9d3.collapse_all(zh-tw,VS.110).gif逐步執行系統呼叫。

您載入系統程式碼的偵錯符號,並啟用 Just My Code 未啟用,您可以逐步執行系統呼叫就可以其他呼叫。

若要了解如何停用 Just My Code,請參閱 Restrict stepping to Just My Code

若要存取 Microsoft 符號檔,請參閱 尋找符號 (.pdb)、來源和二進位檔案 主題中的 使用視窗和其他 Microsoft 符號

載入特定系統元件的符號,在偵錯時:

  1. 開啟模組視窗 (快速鍵: Ctrl+Alt+U)。

  2. 選取您要載入符號的模組。

    您可以透過查看 [符號狀態] 欄來判斷哪些模組已經載入符號。

  3. 選取內容功能表上的 [載入符號。] 。

y740d9d3.collapse_all(zh-tw,VS.110).gif逐步執行屬性及運算子在 Managed 程式碼

預設為偵錯工具不進入屬性和運算子在 Managed 程式碼。 在大部分情況下,這會產生比較令人滿意的偵錯經驗。 若要啟用逐步執行屬性或運算子,請選取 [偵錯]],則 [選項和設定]。 在 [偵錯] 中, [ [概觀] 頁面中,清除 [在屬性和運算子的步驟 (僅限 Managed)] 核取方塊。

本主題內容

停止偵錯

停止偵錯表示終止偵錯工作階段。 停止執行表示終止正在偵錯的處理序,並且結束偵錯工作階段。 這個動作有別於中斷執行,中斷執行是暫時中止正在偵錯的處理序,但偵錯工作階段仍為使用中 中斷連結處理序停止偵錯處理序,但是會使它執行。

從 Visual Studio 停止偵錯

選取 [偵錯]],則 [停止偵錯]。

[停止偵錯] 終止正在偵錯的處理序,如果程式從 Visual Studio 啟動。 如果您附加至處理序 (而不是啟動它從 Visual Studio,處理序會繼續執行。

停止偵錯並重新啟動

選取 [偵錯]],則 [重新啟動] 停止目前的偵錯工作階段並重新開始偵錯工具的啟始專案。

結束偵錯的應用程式

當您結束偵錯的應用程式,自動偵錯大綱。