前言 我的主力環境是 Windows 系統,但是同樣需要維護一些 linux 工程代碼。一般情況下,只需要開個 vmware 虛擬機,裝個 linux 系統就可以進行修改,編譯和調試操作,但是有時候我卻需要對 linux 真機環境進行遠程調試,這時候如果能直接在 windows 系統載入 linux ...
前言
我的主力環境是 Windows 系統,但是同樣需要維護一些 linux 工程代碼。一般情況下,只需要開個 vmware 虛擬機,裝個 linux 系統就可以進行修改,編譯和調試操作,但是有時候我卻需要對 linux 真機環境進行遠程調試,這時候如果能直接在 windows 系統載入 linux 工程代碼進行遠程調試,那當然是最好不過的。經過後續的調查,發現有兩個方案,一個是使用 VisualGDB
插件,一個是直接使用 vscode
,其中 VisualGDB
插件是最傻瓜的,配合 visual stduio
使用,但是我們需要尋找特別版,且需要熟悉其使用方法和配置,vscode
就相對輕量簡單,大家可以根據自己的需求選擇方案,這裡介紹一下 vscode
配置遠程linux調試的方法
流程
首先是編寫 vscode
的 launch.json
文件,內容如下:
{
// 使用 IntelliSense 瞭解相關屬性。
// 懸停以查看現有屬性的描述。
// 欲瞭解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "remote-attach",
"type": "cppdbg",
"request": "attach",
"program": "/usr/bin/test",
"processId":"${command:pickRemoteProcess}",
"sourceFileMap":{
"/home/magicdmer/workplace/test": "D:/Gitwork/test"
},
"pipeTransport": {
//"pipeCwd": "/usr/local/test",
"pipeProgram": "C:/Windows/System32/OpenSSH/ssh.exe",
"pipeArgs": ["[email protected]"],
"debuggerPath": "/usr/bin/gdb"
},
"MIMode": "gdb"
}
]
}
這裡要註意下麵幾個欄位:
- processId,這個需要填寫
pickRemoteProcess
, 而本地調試是pickProcess
很容易被忽略 - sourceFileMap,這個是源文件映射,我們在linux編譯環境編譯test調試版程式後,test程式自身會包含代碼所在的位置信息,我們需要在這裡把原本的位置信息映射到本地的對應目錄
- pipTransport,這個就是用來遠程掛載目標機器調試程式的配置信息,下麵進行詳細描述
pipeTransport 的配置
我們上面的配置文件使用 ssh 來進行遠程通訊,其中 OpenSSH 程式應該在 win10 之後都是自帶的,大家可以自行查看,如果沒有的話可以自行安裝一個即可
我們使用 vscode 的 Remote - SSH
系列插件後,打開遠程系統上的源碼文件夾,vscode 會彈框提示我們輸入用戶密碼,但是我們進行 pipTransport 遠程配置的時候,它是不會彈框提示我們輸入密碼的,我們必須配置一種可以無需輸入密碼,無需確定,直接 ssh 遠程目標機器的方法,流程如下:
- 生成本地 ssh 的key文件
ssh-keygen 也是 openssh 目錄中自帶的程式,運行後預設是在本地用戶目錄下的 .ssh 目錄下ssh-keygen -t rsa
- 然後我們需要將生成的key文件拷貝到需要調試的 linux 機器,這裡使用 ssh-copy-id 工具,這個工具 openssh 沒有自帶,需要安裝 git-for-windows 或者 msys64 交叉編譯環境,使用其自帶的:
它會自動從當前系統的用戶目錄下的 .ssh 目錄中拷貝對應文件到目標機器,寫入相關配置文件,如果需要指定目錄文件,可以使用 -i 選項指定證書文件ssh-copy-id [email protected]
- 然後我們使用 cmd 命令行,用 ssh 連接一次遠程機器,會提示是否繼續連接,我們輸入 yes 繼續,它會保留我們的選擇,這樣就完成了無需密碼和確認直接連接遠程 linux 環境的配置操作
最後,我們就可以愉快的玩耍了
~ 個人簽名: 無論發生什麼都不要停下,無論到什麼時候都要繼續前行,要一直走下去,直到生命終止的那一刻!~