使用 Visual Studio GDB 擴充套件在 Visual Studio 上遠端偵錯 Linux 上的 C/C++ 程式

在 Linux 上開發 C/C++ 的應用程式,或許你會直接(本機或遠端)登入 Linux,打開編輯器寫完程式碼後,就用 gcc/g++ 來編譯程式,遇到要除錯(debug)的時候,則會選擇使用 gdb 來進行除錯。現在,如果你剛好也很喜歡 Visual Studio,你可以不必改變習慣,用 Visual Studio 寫程式、然後遠端送到 Linux 上編譯、甚至還能接上 gdb 來除錯。這個對於開發像是嵌入式系統、或是 IoT 裝置的程式等等就可以多多利用 Visual Studio 強大的 IDE 能力。


圖: 應該有不少在 Linux 上寫程式的開發人員是這麼工作的吧?

如何做?

首先,你必須使用 Visual Studio 2015,你可以使用免費版[1]的 Visual Studio 2015 Community 或是其它更高等級的版本,記得在安裝時要勾選 Visual C++ 以及 C++ 跨平台行動開發這兩個元件:


圖: 安裝 Visual C++

然後只要再安裝 Visual Studio GDB Debugger 這個擴充套件,就能夠在 Visual Studio 的 Visual C++ > 跨平台 的專案類型中選擇 Makefile Project (GDB) 的專案範本。


圖: 在 Visual Studio 中建立 Makefile Project (GDB)

建立專案後,啟始畫面就會有簡單的說明如何連接遠端的 GDB 來進行除錯,照著做應該就沒有什麼大問題了。會用到與 SSH 相關的工具可以到 PuTTY 的網站上下載相關的工具。


圖: 使用 VS GDB 擴充套件的教學

首先在專案上按右鍵選擇內容,設定偵錯的環境,像是遠端主機的位址、然後認證用的 pub/private key,還有連接的方式(ssh 或 plink)等等,這裡要注意的是連接伺服器是使用 RSA 的公私鑰的方式進行認證,所以你必須先產生一組 RSA 金鑰,然後在 Linux 主機上放好公鑰,然後這裡設定是用私鑰去驗證(圖中的 .ppk 檔案)。


圖: 設定遠端主機連線的資訊

然後就是設定在編譯程式時要如何把程式上傳到目標的 Linux 機器上,然後用機器上的 gcc/g++ 來進行編譯,切換到 NMake 的設定頁,設定建置指令:


圖: 設定如何將程式丟上遠端主機並且進行編譯

這裡我的設定值是:

d:\tools\pscp.exe -i $(PrivateKey) "D:\Temp\Project1\Project1\main.cpp" $(RemoteUserName)@$(RemoteHostName):$(RemoteWorkingDirectory)/main.cpp$(SecureShellExecutable) $(RemoteUserName)@$(RemoteHostName) -i $(PrivateKey) "cd $(RemoteWorkingDirectory);g++ -g main.cpp -o $(RemoteExecutable)"

這裡我是用 pscp 把檔案傳上 Linux 主機上後,再呼叫 g++ 來進行編譯,其它的變數都是前面設定的值,你可以根據你的工具以及檔案所在位置做修改。

接下來你就可以開始撰寫程式了,然後就像在 Visual Studio 裡寫其它程式一樣設定中斷點,但是執行時選擇 Remote GDB 就可以開始進行遠端偵錯了。

>
圖: 啟動遠端主機的 gdb 來除錯,但結合 Visual Studio 的偵錯介面

看起來就好像都是在 Visual Studio 中的除錯畫面,但是這隻程式確實已經送上 Linux 主機進行編譯,並且使用 gdb 來進行偵錯了!