教學課程:在同一個偵錯工作階段中進行 C# 和 C++ 偵錯
Visual Studio 可讓您在偵錯工作階段中啟用多個偵錯工具類型,稱為混合模式偵錯。 在本教學課程中,您將了解如何在單一偵錯工作階段中,同時對受控程式碼與機器碼進行偵錯。
本教學課程示範如何從受控應用程式偵錯機器碼,但您也可從原生應用程式偵錯受控程式碼。 此偵錯工具也支援其他類型的混合模式偵錯 (例如偵錯 Python 和機器碼),並在 ASP.NET 等應用程式類型中使用指令碼偵錯工具。
在此教學課程中,您需要:
- 建立簡單的原生 DLL
- 建立呼叫 DLL 的簡單 .NET Core 或 .NET Framework 應用程式
- 設定混合模式偵錯
- 啟動偵錯工具
- 在受控應用程式中叫用中斷點
- 逐步執行機器碼
必要條件
您必須安裝具有下列工作負載的 Visual Studio:
- 使用 C++ 的傳統型開發
- .NET 桌面開發
您必須安裝具有下列工作負載的 Visual Studio:
- 使用 C++ 的傳統型開發
- .NET 桌面開發或 .NET Core 跨平台開發,視您要建立的應用程式類型而定。
如果您沒有 Visual Studio,請前往 Visual Studio 下載頁面免費進行安裝。
如果您已安裝 Visual Studio,但沒有所需的工作負載,請在 Visual Studio [新增專案] 對話方塊的左窗格中,選取 [開啟 Visual Studio 安裝程式]。 在 Visual Studio 安裝程式中,選取您所需的工作負載,然後選取 [修改]。
建立簡單的原生 DLL
若要建立 DLL 專案檔:
開啟 Visual Studio 並建立專案。
按 Esc 來關閉開始視窗。 輸入 [Ctrl + Q] 來開啟搜尋方塊,輸入 [空白專案],選擇 [範本],然後為 C++ 選擇 [空白專案]。 在出現的對話方塊中,選擇 [建立]。 然後,鍵入像 Mixed_Mode_Debugging 的名稱,並按一下 [建立]。
如果您未看到 [空白專案] 專案範本,請前往 [工具]>[取得工具與功能...],以開啟 Visual Studio 安裝程式。 Visual Studio 安裝程式即會啟動。 選擇 [使用 C++ 的桌面開發] 工作負載,然後選擇 [修改] 按鈕。
Visual Studio 會建立專案。
在 [方案總管] 中,選取 [來源檔案],然後選取 [專案]>[新增項目]。 或者,以滑鼠右鍵按一下 [來源檔案],然後選取 [新增]>[新增項目]。
如果您沒有看到所有項目範本,請選擇 [顯示所有範本]。
在 [新增項目] 對話方塊中,選取 [C++ 檔 (.cpp)]。 在 [名稱] 欄位中,鍵入 Mixed_Mode.cpp,然後選取 [新增]。
Visual Studio 隨即將新的 C++ 檔新增至 [方案總管]。
將下列程式碼複製到 Mixed_Mode.cpp 中:
#include "Mixed_Mode.h"
在 [方案總管] 中,選取 [標頭檔],然後選取 [專案]>[新增項目]。 或者,以滑鼠右鍵按一下 [標頭檔],然後選取 [新增]>[新增項目]。
如果您沒有看到所有項目範本,請選擇 [顯示所有範本]。
在 [新增項目] 對話方塊中,選取 [標頭檔 (.h)]。 在 [名稱] 欄位中,鍵入 Mixed_Mode.h,然後選取 [新增]。
Visual Studio 隨即將新的標頭檔新增至 [方案總管]。
將下列程式碼複製到 Mixed_Mode.h 中:
#ifndef MIXED_MODE_MULTIPLY_HPP #define MIXED_MODE_MULTIPLY_HPP extern "C" { __declspec(dllexport) int __stdcall mixed_mode_multiply(int a, int b) { return a * b; } } #endif
選取 [檔案]>[全部儲存],或按 Ctrl+Shift+S 以儲存檔案。
若要設定並建置 DLL 專案:
在 Visual Studio 工具列中,選取 [偵錯] 組態,然後選取 [x86] 或 [x64] 平台。 如果您的呼叫應用程式將會是一律是在 64 位元模式執行的 .NET Core,請選取 [x64] 作為平台。
在 [方案總管] 中,選取 Mixed_Mode_Debugging 專案節點,然後選取屬性圖示;或以滑鼠右鍵按一下專案節點,然後選取選取 [屬性]。
在 [屬性] 窗格頂端,確定 [組態] 已設定 [作用中 (偵錯)],且 [平台] 是您在工具列中設定的相同平台:[x64] (若為 x86 平台,則為 [Win32])。
重要
如果您在 [x86] 與 [x64] 之間切換平台,則必須重新設定新平台的屬性。
在左窗格的 [組態屬性] 下,選取 [連結器]>[進階],然後在 [無進入點] 旁的下拉式清單中選取 [否]。 如果您必須將它變更為 [否],請選取 [套用]。
在 [組態屬性] 下,選取 [一般],然後在 [組態類型] 旁的下拉式清單中選取 [動態程式庫 (.dll)]。 選取 [套用],然後選取 [確定]。
在 [方案總管] 中選取專案,然後選取 [建置]Build>[建置方案]、按 F7 鍵,或以滑鼠右鍵按一下專案並選取 [建置]。
專案應該會建置而無錯誤。
建立呼叫 DLL 的簡單受控應用程式
開啟 Visual Studio 並建立新專案。
按 Esc 來關閉開始視窗。 輸入 [Ctrl + Q] 來開啟搜尋方塊,輸入 [主控台],選擇 [範本],然後為 .NET Core 選擇 [主控台應用程式] 或為 C# 選擇 [主控台應用程式 (.NET Framework)]。 在出現的對話方塊中,選擇 [下一步]。
然後,輸入名稱,例如 [Mixed_Mode_Calling_App],並且按 [下一步] 或 [建立] (取決於哪個選項可用)。
對於 .NET Core,請選擇建議的目標框架或 .NET 8,然後選擇 [建立]。
如果您沒看到正確的專案範本,請前往 [工具]>[取得工具和功能...],如此就會開啟 Visual Studio 安裝程式。 依照必要條件中所述選擇正確的 .NET 工作負載,然後選擇 [修改]。
注意
您也可以將新的受控專案新增至現有的 C++ 解決方案中。 我們正在以新的解決方案建立專案,以使混合模式偵錯工作更加困難。
Visual Studio 會建立空白專案,並在 [方案總管] 中顯示。
將 Program.cs 中的所有程式碼取代為下列程式碼:
using System; using System.Runtime.InteropServices; namespace Mixed_Mode_Calling_App { public class Program { // Replace the file path shown here with the // file path on your computer. For .NET Core, the typical (default) path // for a 64-bit DLL might look like this: // C:\Users\username\source\repos\Mixed_Mode_Debugging\x64\Debug\Mixed_Mode_Debugging.dll // Here, we show a typical path for a DLL targeting the **x86** option. [DllImport(@"C:\Users\username\source\repos\Mixed_Mode_Debugging\Debug\Mixed_Mode_Debugging.dll", EntryPoint = "mixed_mode_multiply", CallingConvention = CallingConvention.StdCall)] public static extern int Multiply(int x, int y); public static void Main(string[] args) { int result = Multiply(7, 7); Console.WriteLine("The answer is {0}", result); Console.ReadKey(); } } }
在新的程式碼中,將
[DllImport]
中檔案路徑取代為您剛建立的 Mixed_Mode_Debugging.dll 檔案路徑。 請參閱程式碼註解以取得提示。 請務必取代 username 預留位置。選取 [檔案]>[儲存 Program.cs],或按 Ctrl+S 以儲存檔案。
設定混合模式偵錯
在 [方案總管] 中,選取 Mixed_Mode_Calling_App 專案節點,然後選取屬性圖示;或以滑鼠右鍵按一下專案節點,然後選取選取 [屬性]。
在屬性中啟用機器碼偵錯。
在左窗格中選取 [偵錯],選取 [開啟偵錯啟動設定檔 UI],然後選取 [啟用機器碼偵錯] 核取方塊,然後關閉屬性頁面以儲存變更。
在左窗格中選取 [偵錯],選取 [啟用機器碼偵錯] 核取方塊,然後關閉屬性頁以儲存變更。
如果您的目標是 .NET Framework 應用程式中的 x64 DLL,請將平台目標從 [任何 CPU] 變更為 x64。 為此,您必須從 [偵錯] 工具列的 [解決方案平台] 下拉清單中選取 [組態管理員]。 然後,如果您無法直接切換至 x64,請建立一個目標為 x64 的 [新] 組態。
設定中斷點,並開始偵錯
在 C# 專案中,開啟 Program.cs。 若要在下列程式碼行設定中斷點,請按一下最左邊,選取該行並按 F9 鍵,或以滑鼠右鍵按一下該行,然後選取 [中斷點]>[插入中斷點]。
int result = Multiply(7, 7);
您設定中斷點的左邊界會出現紅色圓圈。
按 F5 鍵、選取 Visual Studio 工具列中的綠色箭號,或選取 [偵錯]>[開始偵錯] 以開始偵錯。
偵錯工具會在您設定的中斷點處暫停。 黃色箭號表示目前已暫停偵錯工具。
逐步執行和跳出機器碼
當偵錯在受控應用程式中暫停時,按 F11 鍵,或選取 [偵錯]>[逐步執行]。
Mixed_Mode.h 原生標頭檔隨即開啟,而且您會在偵錯工具的暫停位置看到黃色箭號。
現在,您可以設定和叫用中斷點,並檢查機器碼或受控程式碼中的變數。
將滑鼠游標移至原始程式碼中的變數上方以查看其值。
在 [自動變數] 和 [區域變數] 視窗中,查看變數及其值。
在偵錯工具中暫停時,您也可以使用 [監看式] 視窗和 [呼叫堆疊] 視窗。
再按一次 F11 鍵,將偵錯工具前移一行。
按 Shift+F11 或選取 [偵錯]>[跳出],以在受控應用程式中繼續執行並再次暫停。
按 F5 鍵或選取綠色箭號,以繼續偵錯應用程式。
恭喜! 您已完成混合模式偵錯的教學課程。
後續步驟
在本教學課程中,您已了解如何啟用混合模式偵錯來從受控應用程式偵錯機器碼。 如需偵錯工具功能概觀,請參閱: