部署、執行 Linux MSBuild 專案及對其進行偵錯

Visual Studio 2017 及更新版本支援 Linux。 若要查看這些版本的檔,請將位於目錄上方 的版本下拉 式清單設定為 Visual Studio 2017Visual Studio 2019

在 Visual Studio 中建立 MSBuild 型 Linux C++ 專案,並使用Linux Connection Manager連線到專案之後,您就可以執行並偵錯專案。 您可以在遠端目標上編譯、執行及偵錯程式碼。

Visual Studio 2019 16.1 版和更新版本:您可以針對不同的 Linux 系統進行偵錯和建置。 例如,以 IoT 案例為目標時,您可以在 x64 上交叉編譯並部署到 ARM 裝置。 如需詳細資訊,請參閱本文稍後的針對建置與偵錯指定不同的電腦

有數種方式可以與 Linux 專案互動,並對其進行偵錯。

  • 使用中斷點、監看式視窗以及將滑鼠指標停留在變數上等傳統 Visual Studio 功能進行偵錯。 使用這些方法,可讓您以對其他專案類型所使用的一般方式進行偵錯。

  • 在 Linux 主控台視窗中檢視目標電腦的輸出。 您也可以使用主控台將輸出傳送到目標電腦。

對 Linux 專案進行偵錯

  1. 在 [偵錯] 屬性頁面中選取偵錯模式。

    GDB 用來偵錯在 Linux 上執行的應用程式。 在遠端系統 (而不是 WSL) 上進行偵錯時,GDB 可以透過兩種不同的模式執行,而您可以從專案 [偵錯] 屬性頁的 [偵錯模式] 選項中進行選取:

    Visual Studio Linux 主控台應用程式屬性頁對話方塊的螢幕擷取畫面,其中已選取 [組態屬性 > 偵錯] 和 [偵錯模式],其中已選取 G D B 並從下拉式清單中醒目提示。

    GDB 用來偵錯在 Linux 上執行的應用程式。 GDB 可以透過兩種不同的模式執行,而您可以從專案 [偵錯] 屬性頁的 [偵錯模式] 選項中進行選取:

    Visual Studio 2017 Linux 主控台應用程式屬性頁對話方塊的螢幕擷取畫面,其中已選取 [組態屬性 > 偵錯] 和 [偵錯模式],其中已選取 G D B 並從下拉式清單中反白顯示。

    • gdbserver 模式中,GDB 會在本機執行,以連線到在遠端系統上的 gdbserver。

    • gdb 模式中,Visual Studio 偵錯工具會在遠端系統上驅動 GDB。 如果本機版本的 GDB 與目的電腦上安裝的版本不相容,這是較佳的選項。 這是 Linux 主控台視窗支援的唯一模式。

    注意

    若無法在 gdbserver 偵錯模式中叫用中斷電,請嘗試 gdb 模式。 必須先在遠端目標上安裝 gdb。

  2. 在 Visual Studio 中使用標準 [偵錯] 工具列選取遠端目標。

    當遠端目標可用時,您會看到它以名稱或 IP 位址列出。

    顯示遠端目標 IP 位址的螢幕擷取畫面。

    如果您尚未連線到遠端目標,您會看到使用Linux Connection Manager連線到遠端目標的指示。

    顯示 x64 遠端架構的螢幕擷取畫面。

  3. 在某些您認定會執行之程式碼的左側裝訂邊上按一下,即可設定中斷點。

    在您設定中斷點的程式碼上會顯示紅點。

  4. F5 (或 > 偵錯開始偵錯) 以開始偵錯。

    當您開始偵錯時,應用程式會在啟動前於遠端目標上編譯。 任何編譯錯誤都會顯示在 [錯誤清單] 視窗中。

    如果沒有任何錯誤,應用程式就會啟動,而偵錯工具則會在中斷點暫停。

    顯示應用程式已叫用中斷點的螢幕擷取畫面。

    現在,您可以按 F10F11之類的命令鍵,以與其目前狀態、檢視變數和逐步執行程式碼互動。

  5. 如果您想要使用 Linux 主控台與應用程式互動,請選取 [ 偵錯 > Linux 主控台]。

    顯示 Linux 主控台功能表項目的螢幕擷取畫面。

    此主控台會顯示目的電腦的任何主控台輸出,並接受輸入,並將其傳送至目的電腦。

    顯示 Linux 主控台視窗的螢幕擷取畫面。

(MSBuild 專案設定其他偵錯選項)

  • 使用專案 [偵錯] 屬性頁中的 [程式引數] 項目,即可將命令列引數傳遞至可執行檔。

  • 您可以在專案的 [偵錯] 屬性頁中使用[啟動前命令] 來匯出 DISPLAY 環境變數。 例如:export DISPLAY=:0.0

    顯示 [屬性頁] 對話方塊中 [程式引數] 屬性的螢幕擷取畫面。

  • 使用 [其他偵錯工具命令] 項目,可以將特定偵錯工具選項傳遞至 GDB。 例如,您可能想要忽略 SIGILL (不合法指令) 訊號。 您可以將下列項目新增至 [其他偵錯工具命令] 項目 (如上所示),以便使用 handle 命令達成此目的:

    handle SIGILL nostop noprint

  • 您可以在專案的 [錯] 屬性頁中使用 GDB 路徑專案,指定 Visual Studio 所使用的GDB 路徑路徑路徑。 此屬性可在 Visual Studio 2019 16.9 版和更新版本中取得。

使用 [附加至處理序] 進行偵錯

Visual Studio 專案的 偵錯 屬性頁和 CMake 專案的 [Launch.vs.json] 設定,具有可讓您附加至執行中處理序的設定。 如果您需要超過這些設定中所提供的更多控制權,您可以將名為 Microsoft.MIEngine.Options.xml 的檔案放在解決方案或工作區的根目錄中。 以下是一個簡單的範例:

<?xml version="1.0" encoding="utf-8"?>
<SupplementalLaunchOptions>
    <AttachOptions>
      <AttachOptionsForConnection AdditionalSOLibSearchPath="/home/user/solibs">
        <ServerOptions MIDebuggerPath="C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\Common7\IDE\VC\Linux\bin\gdb\7.9\x86_64-linux-gnu-gdb.exe"
ExePath="C:\temp\ConsoleApplication17\ConsoleApplication17\bin\x64\Debug\ConsoleApplication17.out"/>
        <SetupCommands>
          <Command IgnoreFailures="true">-enable-pretty-printing</Command>
        </SetupCommands>
      </AttachOptionsForConnection>
    </AttachOptions>
</SupplementalLaunchOptions>

AttachOptionsForConnection 具有大部分您可能需要的屬性。 上述範例示範如何指定要搜尋更多 .so 程式庫的位置。 子元素 ServerOptions 可讓您改為附加至 gdbserver 的遠端程序。 若要這樣做,您必須指定本機 gdb 用戶端, (Visual Studio 2017 中隨附的用戶端會顯示在上方) ,以及具有符號的二進位檔本機複本。 SetupCommands 元素可讓您直接傳遞至 gdb 命令。 您可以在 GitHub 上找到 LaunchOptions.xsd 結構描述 的所有可用選項。

指定在 MSBuild 型 Linux 專案中建置和偵錯的不同機器

您可以針對以遠端 Linux 電腦為目標的 MSBuild 型 Linux 專案和 CMake 專案,將遠端建置電腦與遠端偵錯電腦分開。 例如,以 IoT 案例為目標時,您現在可以在 x64 上交叉編譯並部署到 ARM 裝置。

根據預設,遠端偵錯電腦與遠端建置電腦相同 (組態屬性>一般>遠端建置電腦) 。 若要指定新的遠端偵錯電腦,以滑鼠右鍵按一下 [方案總管] 中的專案,並移至 [組態屬性]>[偵錯]>[遠端偵錯電腦]

顯示 [屬性頁] 對話方塊中 Linux 遠端偵錯機器屬性的螢幕擷取畫面,其中顯示使用者名稱、驗證類型和埠。

[遠端偵錯電腦] 的下拉式功能表會填入所有已建立的遠端連線。 若要新增遠端連線,請流覽至 [工具>選項>跨平臺>]Connection Manager或在[快速啟動] 中搜尋 「Connection Manager」。 您也可以在專案的 [屬性頁] 中指定新的遠端部署目錄, ([組態屬性>] [一般>遠端部署目錄]) 。

根據預設,只有處理序偵錯所需的檔案會部署到遠端偵錯電腦。 您可以使用 [方案總管] 設定部署到遠端偵錯電腦的原始程式檔。 當您按一下來源檔案時,您會在Solution Explorer下方看到其 [檔案屬性] 的預覽。

顯示 main.cpp 檔案屬性的螢幕擷取畫面,其中已醒目提示屬性內容 = False。

[內容] 屬性會指定是否將檔案部署到遠端偵錯電腦。 您可以流覽至[屬性頁>組態管理員] 並取消核取 [部署] 以完全停用部署,以取得所需的組態。

在某些情況下,您可能需要更充分掌控專案的部署。 例如,您想要部署的某些檔案可能不在解決方案之外,或您想要自訂每個檔案或目錄的遠端部署目錄。 在這些情況下,將下列程式碼區塊附加至 .vcxproj 檔案,並以實際的檔案名稱取代 "example.cpp":


<ItemGroup>
   <RemoteDeploy Include="__example.cpp">
<!-- This is the source Linux machine, can be empty if DeploymentType is LocalRemote -->
      <SourceMachine>$(RemoteTarget)</SourceMachine>
      <TargetMachine>$(RemoteDebuggingTarget)</TargetMachine>
      <SourcePath>~/example.cpp</SourcePath>
      <TargetPath>~/example.cpp</TargetPath>
<!-- DeploymentType can be LocalRemote, in which case SourceMachine will be empty and SourcePath is a local file on Windows -->
      <DeploymentType>RemoteRemote</DeploymentType>
<!-- Indicates whether the deployment contains executables -->
      <Executable>true</Executable>
   </RemoteDeploy>
</ItemGroup>

CMake 專案

針對以遠端 Linux 電腦為目標的 CMake 專案,您可以在 launch.vs.json 中指定新的遠端偵錯電腦。 根據預設,"remoteMachineName" 的值會與 CMakeSettings.json 中,對應至您遠端組建電腦的 "remoteMachineName" 屬性同步處理。 這些屬性不再需要比對,而且 launch.vs.json 中的 "remoteMachineName" 值將會指定用於部署和偵錯的遠端電腦。

launch_schema.json 檔案中指定的 CMake 遠端偵錯電腦。遠端電腦名稱稱為 ${debugInfo 。 remoteMachineName}

IntelliSense 將會建議所有已建立之遠端連線的所有清單。 您可以流覽至 [工具>選項>跨平臺>] 來新增遠端連線Connection Manager或在[快速啟動] 中搜尋 「Connection Manager」。

如果您想要完整控制部署,可以將下列程式碼區塊附加到 launch.vs.json 檔案。 請記得以實際的值取代預留位置值:

"disableDeploy": false,
"deployDirectory": "~\foo",
"deploy" : [
   {
      "sourceMachine": "127.0.0.1 (username=example1, port=22, authentication=Password)",
      "targetMachine": "192.0.0.1 (username=example2, port=22, authentication=Password)",
      "sourcePath": "~/example.cpp",
      "targetPath": "~/example.cpp",
      "executable": "false"
   }
]

下一步

另請參閱

C++ 偵錯屬性 (Linux C++)