部署、執行 Linux MSBuild 專案及對其進行偵錯
Visual Studio 2017 及更新版本支援 Linux。 若要查看這些版本的檔案,請將位於 Visual Studio 2017 或 Visual Studio 2019 目錄上方的版本下拉式清單設定為 。
在 Visual Studio 中建立 MSBuild 型 Linux C++ 專案,並使用 Linux 連線管理員 連線到項目之後,您就可以執行並偵錯專案。 您可以在遠端目標上編譯、執行及偵錯程式碼。
Visual Studio 2019 16.1 版和更新版本:您可以針對不同的 Linux 系統進行偵錯和建置。 例如,以 IoT 案例為目標時,您可以在 x64 上交叉編譯並部署到 ARM 裝置。 如需詳細資訊,請參閱本文稍後的針對建置與偵錯指定不同的電腦。
有數種方式可以與 Linux 專案互動,並對其進行偵錯。
使用中斷點、監看式視窗以及將滑鼠指標停留在變數上等傳統 Visual Studio 功能進行偵錯。 使用這些方法,可讓您以對其他專案類型所使用的一般方式進行偵錯。
在 Linux 主控台視窗中檢視目標電腦的輸出。 您也可以使用主控台將輸出傳送到目標電腦。
對 Linux 專案進行偵錯
在 [偵錯] 屬性頁面中選取偵錯模式。
GDB 用來偵錯在 Linux 上執行的應用程式。 在遠端系統 (而不是 WSL) 上進行偵錯時,GDB 可以透過兩種不同的模式執行,而您可以從專案 [偵錯] 屬性頁的 [偵錯模式] 選項中進行選取:
GDB 用來偵錯在 Linux 上執行的應用程式。 GDB 可以透過兩種不同的模式執行,而您可以從專案 [偵錯] 屬性頁的 [偵錯模式] 選項中進行選取:
在 gdbserver 模式中,GDB 會在本機執行,以連線到在遠端系統上的 gdbserver。
在 gdb 模式中,Visual Studio 偵錯工具會在遠端系統上驅動 GDB。 如果本機版本的 GDB 與目標電腦上安裝的版本不相容,則這是較佳的選項。 這是 Linux 控制台視窗支援的唯一模式。
注意
若無法在 gdbserver 偵錯模式中叫用中斷電,請嘗試 gdb 模式。 必須先在遠端目標上安裝 gdb。
在 Visual Studio 中使用標準 [偵錯] 工具列選取遠端目標。
當遠端目標可用時,您會看到它依名稱或 IP 位址列出。
如果您尚未連線到遠端目標,您會看到使用 Linux 連線管理員 連線到遠端目標的指示。
在某些您認定會執行之程式碼的左側裝訂邊上按一下,即可設定中斷點。
在您設定中斷點的程式碼上會顯示紅點。
按 F5 (或>偵錯開始偵錯) 以開始偵錯。
當您開始偵錯時,應用程式會在啟動前於遠端目標上編譯。 任何編譯錯誤都會顯示在 [錯誤清單] 視窗中。
如果沒有任何錯誤,應用程式就會啟動,而偵錯工具則會在中斷點暫停。
您現在可以和目前狀態下的應用程式互動、檢視變數,以及按 F10 或 F11 等命令鍵逐步完成程式碼。
如果您想要使用 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 裝置。
根據預設,遠端偵錯電腦與遠端組建電腦 ([組態屬性]>[一般]>[遠端組建電腦]) 相同。 若要指定新的遠端偵錯電腦,以滑鼠右鍵按一下 [方案總管] 中的專案,並移至 [組態屬性]>[偵錯]>[遠端偵錯電腦]。
[遠端偵錯電腦] 的下拉式功能表會填入所有已建立的遠端連線。 若要新增遠端連線,請瀏覽至 [工具]>[選項]>[跨平台]>[連線管理員],或在 [快速啟動] 中搜尋「連線管理員」。 您也可以在專案的 [屬性頁] 中指定新的遠端部署目錄(組態屬性>一般>遠端部署目錄)。
根據預設,只有處理序偵錯所需的檔案會部署到遠端偵錯電腦。 您可以使用 [方案總管] 設定部署到遠端偵錯電腦的原始程式檔。 當您按下原始程式檔時,您會看到其檔案屬性的預覽,其檔案屬性緊接在 方案總管 下方。
[內容] 屬性會指定是否將檔案部署到遠端偵錯電腦。 若要完全停用部署,請瀏覽至 [屬性頁]>[組態管理員],然後針對所需的組態,取消核取 [部署]。
在某些情況下,您可能需要更充分掌控專案的部署。 例如,您想要部署的某些檔案可能不在解決方案之外,或您想要自定義每個檔案或目錄的遠端部署目錄。 在這些情況下,將下列程式碼區塊附加至 .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" 值將會指定用於部署和偵錯的遠端電腦。
IntelliSense 將會建議所有已建立之遠端連線的所有清單。 若要新增遠端連線,請瀏覽至 [工具]>[選項]>[跨平台]>[連線管理員],或在 [快速啟動] 中搜尋「連線管理員」。
如果您想要完整控制部署,可以將下列程式碼區塊附加到 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"
}
]
下一步
- 若要在 Linux 上偵錯 ARM 裝置,請參閱此部落格文章:Debugging an embedded ARM device in Visual Studio (在 Visual Studio 中對內嵌 ARM 裝置進行偵錯)。