偵錯多個處理序 (C#、Visual Basic、C++)

Visual Studio 可以偵錯具有數個處理序的解決方案。 您可以在處理序之間啟動和切換、中斷、繼續、逐步執行來源、停止偵錯,以及結束或中斷連結個別處理序。

使用多個處理序開始偵錯

當 Visual Studio 解決方案中有多個專案可以獨立執行時,您可以選取偵錯工具要啟動的專案。 目前的啟動專案會在 [方案總管] 中以粗體顯示。

若要變更啟動專案,,請在 [方案總管] 中,以滑鼠右鍵按一下不同專案,並選取 [設定為啟動專案]

若要從 [方案總管] 開始偵錯專案,而不讓該專案成為啟動專案,請以滑鼠右鍵按一下專案,並選取 [偵錯]>[啟動新執行個體] 或 [逐步執行新執行個體]

若要從解決方案屬性設定啟動專案或多個專案:

  1. 在 [方案總管] 中按一下解決方案,然後在工具列中選取 [屬性] 圖示,或以滑鼠右鍵按一下解決方案,並選取 [屬性]

  2. 在 [屬性] 頁面中,選取 [通用屬性]>[啟動專案]

    Changing the startup type for a project

  3. 選取 [目前選取項目]、[單一啟動專案],以及專案檔案,或 [多個啟動專案]

    如果您選取 [多個啟動專案],您可以變更每個專案的啟動順序和動作:[啟動]、[啟動但不偵錯],或 [無]

  4. 選取 [套用] 或 [確定],以套用並關閉對話方塊。

連結至處理序

偵錯工具也可以連結至在 Visual Studio 外部處理序執行的應用程式,包括遠端裝置上的處理序。 連結至應用程式之後,您即可使用 Visual Studio 偵錯工具。 偵錯功能可能會受到限制。 這取決於應用程式是否使用偵錯資訊建置、您是否有權存取應用程式的原始程式碼,以及 JIT 編譯程式是否追蹤偵錯資訊。

如需詳細資訊,請參閱連結至執行中的處理序

附加至執行中的處理序:

  1. 執行應用程式後,選取 [偵錯]>[連結至處理序]

    Attach to Process dialog box

  2. 在 [連結至處理序] 對話方塊中,從 [可使用的處理序] 清單中選取處理序,然後選取 [連結]

注意

偵錯工具不會自動附加至所偵錯處理序啟動的子處理序 (即使子專案位於相同方案中)。 若要偵錯子處理序,請在子處理序啟動之後連結至子處理序,或設定 Windows Registry Editor,以在新偵錯工具執行個體中啟動子處理序。

在偵錯工具中使用登錄編輯器以自動啟動處理序

有時候,您可能需要對其他處理序所啟動的應用程式,偵錯啟始程式碼。 這類範例包括了服務和自訂安裝動作。 您可以啟動偵錯工具,並自動連結至應用程式。

  1. 藉由執行 regedit.exe 以啟動 Windows Registry Editor。

  2. 在 Registry Editor 中,導覽至 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

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

    如果應用程式未列在子資料夾中,請以滑鼠右鍵按一下 [影像檔案執行選項],選取 [新增]>[索引鍵],然後輸入應用程式名稱。 或者,以滑鼠右鍵按一下樹狀結構中的新索引鍵,選取 [重新命名],然後輸入應用程式名稱。

  4. 以滑鼠右鍵按一下樹狀結構中的新索引鍵,然後選取 [新增]>[字串值]

  5. 將新值名稱從 New Value #1 變更為 debugger

  6. 以滑鼠右鍵按一下 [偵錯工具],並選取 [修改]

    Edit String dialog box

  7. 在 [編輯字串] 對話方塊中,在 [值資料] 方塊中,輸入 vsjitdebugger.exe,然後選取 [確定]

    Automatic debugger start entry in regedit.exe

使用多個處理序進行偵錯

使用數個處理序對應用程式進行偵錯時,中斷、逐步執行和繼續偵錯工具命令預設會影響所有處理序。 例如,當一個處理序在中斷點暫止時,所有其他處理序的執行也會暫止。 您可以變更這項預設行為,以便更充分掌控執行命令的目標。

若要變更某個處理序中斷時,是否會暫止所有處理序:

  • 在 [工具] (或 [偵錯]) >[選項]>[偵錯]>[一般] 下,選取或清除 [如果其中一個處理序中斷,就中斷所有處理序] 核取方塊。

中斷、逐步執行和繼續命令

下表描述選取或取消選取 [如果其中一個處理序中斷,就中斷所有處理序] 核取方塊時,偵錯命令的行為:

命令 已選取 已取消選取
[偵錯]>[全部中斷] 所有處理序都會中斷。 所有處理序都會中斷。
[偵錯]>[繼續] 所有處理序都會繼續執行。 所有暫止的處理序都會繼續執行。
[偵錯]>[逐步執行]、[不進入函式],或 [跳離函式] 當目前處理序逐步執行時,所有處理序仍會執行。
然後所有處理序都會中斷。
目前處理序會逐步執行。
暫止的處理序會繼續執行。
執行中的處理序會繼續執行。
[偵錯]>[逐步執行目前處理序]、[目前處理序不進入函式],或 [目前處理序跳離函式] N/A 目前處理序會逐步執行。
其他處理序維持其現有的狀態 (已暫止或執行中)。
來源視窗中斷點 所有處理序都會中斷。 只要來源視窗處理序會中斷。
來源視窗執行至游標處
來源視窗必須在目前處理序中。
當來源視窗處理序執行至游標處然後中斷時,所有處理序仍會執行。
然後所有其他處理序都會中斷。
來源視窗處理序會執行至游標處。
其他處理序維持其現有的狀態 (已暫止或執行中)。
[處理序] 視窗 >[中斷處理序] N/A 選取的處理序會中斷。
其他處理序維持其現有的狀態 (已暫止或執行中)。
[處理序] 視窗>繼續處理 N/A 選取的處理序會繼續執行。
其他處理序維持其現有的狀態 (已暫止或執行中)。

尋找來源和符號 (.pdb) 檔案

若要巡覽處理序的原始程式碼,偵錯工具需要存取處理序的來源檔案和符號檔案。 如需詳細資訊,請參閱指定符號 (.pdb) 和來源檔案

如果您無法存取處理序的檔案,可以使用 [反組譯碼] 視窗進行巡覽。 如需詳細資訊,請參閱如何:使用反組譯碼視窗

在處理序之間切換

進行偵錯時,您可以連結至多個處理序,但是無論在任何時間,偵錯工具一次只能有一個作用中處理序。 您可以在 [偵錯位置] 工具列或 [處理序] 視窗中設定使用中或「目前的」處理序。 若要在處理序之間切換,兩個處理序必須處於中斷模式。

若要從 [偵錯位置] 工具列設定目前的處理序:

  1. 若要開啟 [偵錯位置] 工具列,請選取 [檢視]>[工具列]>[偵錯位置]

  2. 偵錯期間,在 [偵錯位置] 工具列中,從 [處理序] 下拉式清單中,選取您要設為目前處理序的處理序。

    Switch between processes

若要從 [處理序] 視窗設定目前處理序:

  1. 若要在偵錯時開啟 [處理序] 視窗,請選取 [偵錯]>[Windows]>[處理序]

  2. 在 [處理序] 視窗中,目前的處理序會以黃色箭號標記。 按兩下您想要設定為目前處理序的處理序。

    Processes window

切換至處理序會將該處理序設為目前要偵錯的處理序。 偵錯工具視窗會顯示目前處理序的狀態,而且所有逐步執行命令只會影響目前處理序。

使用多個處理序停止偵錯

根據預設,當您選取 [偵錯]>[停止偵錯] 時,偵錯工具會結束或中斷連結所有處理序。

  • 如果目前處理序是在偵錯工具中啟動,該處理序會結束。

  • 如果您將偵錯工具附加至目前的處理序,則偵錯工具會與處理序中斷連結,並讓處理序繼續執行。

如果您從 Visual Studio 解決方案開始偵錯處理序,請連結至另一個已在執行中的處理序,然後選擇 [停止偵錯],偵錯工作階段會結束。 在 Visual Studio 中啟動的處理序會結束,而連結的處理序會繼續執行。

若要控制停止偵錯影響個別處理序的方式,請在 [處理序] 視窗中,以滑鼠右鍵按一下處理序,然後選取或清除 [偵錯停止時中斷連結] 核取方塊。

注意

[如果其中一個處理序中斷,就中斷所有處理序] 偵錯工具選項不會影響停止處理序、終止處理序,或中斷連結處理序。

停止、結束及中斷連結命令

下表描述對多個處理序進行停止、終止和中斷連結命令的偵錯工具行為:

命令 說明
[偵錯]>[停止偵錯] 除非在 [處理序] 視窗中變更行為,否則偵錯工具啟動的處理序會結束,而且連結的處理序會中斷連結。
[偵錯]>[全部終止] 所有處理序會結束。
[偵錯]>[全部中斷連結] 偵錯工具會從所有處理序中斷連結。
[處理序] 視窗 >[中斷連結處理序] 偵錯工具會從選取的處理序中斷連結。
其他處理序維持其現有的狀態 (已暫止或執行中)。
[處理序] 視窗 >[終止處理序] 選取的處理序會結束。
其他處理序維持其現有的狀態 (已暫止或執行中)。
[處理序] 視窗 >[偵錯停止時中斷連結] 如果已選取,[偵錯]>[停止偵錯] 會中斷連結選取的處理序。
如果未選取,[偵錯]>[停止偵錯] 會結束選取的處理序。