segmentfault對應博文頁面:https://segmentfault.com/a/1190000016300215 最近一直在閱讀ovs的源碼,看到用戶態代碼的時候,需要對用戶態的代碼進行調試,一開始想直接使用linux中的GDB進行調試,但是ovs的工程太過於複雜,從網上找了些文章,發現 ...
segmentfault對應博文頁面:https://segmentfault.com/a/1190000016300215
最近一直在閱讀ovs的源碼,看到用戶態代碼的時候,需要對用戶態的代碼進行調試,一開始想直接使用linux中的GDB進行調試,但是ovs的工程太過於複雜,從網上找了些文章,發現vs2017能夠支持linux c++程式的調試,搗鼓了一下午,遇到了一些坑,終於搭建好了開發環境。
最新版的vs 2017支持linux環境編程,與傳統vs上的windows編程不同的是,vs2017 所需要的Linux環境需要搭載在一個linux的伺服器上,vs 2017 相當於將windows系統和這個linux系統之間建立了某種映射,可以將代碼複製到linux中對應的目錄中,並且windows系統中的vs 2017能夠看到運行的情況,甚至是對代碼進行斷點調試。
開發環境
window 10操作系統,vs 2017 community版,VMware12.5.7
在VMware中安裝ubuntu14桌面版
vs 2017的安裝
官網下載地址https://visualstudio.microsoft.com/zh-hans/?rr=https%3A%2F%2Fwww.microsoft.com%2Fzh-cn%2F
從官網下載最新的vs 2017,在安裝的過程中需要註意,如果你需要搭建linux c++環境,需要勾選“使用c++的linux開發”工具集,見下圖
配置ubuntu環境
在ubuntu中安裝好c++環境,因為vs 2017需要通過ssh登陸ubuntu系統,所以也需要安裝好ssh服務,命令如下:
sudo apt-get install openssh-server g++ gdb gdbserver
開始ssh服務:
sudo service ssh start
vs2017創建linux項目
打開vs2017,步驟如下,文件-->新建項目-->跨平臺-->linux->控制台應用程式(linux)
新建完成項目之後,vs2017自動生成一個簡單的maic.cpp文件
菜單欄選擇 調試->cross platform->add 將剛纔建立的Ubuntu伺服器用戶信息輸入進去
右鍵解決方案,可以看到當前程式的屬性頁面,點擊配置屬性->常規->遠程生成電腦,選擇剛剛新建的賬戶,可以看到,在該頁面下,預設的遠程生成根目錄在"~/projects"下麵,待會兒可以看到在ubuntu對應的目錄下會生成項目的代碼。
菜單欄選擇調試->Linux Console打開linux程式的控制台
可以在程式中打斷點,點擊調試按鈕進行運行,可以看到控制台列印出信息
登陸ubuntu,在~/projects目錄下麵可以看到新生成的項目文件夾“test”
遇到問題
上述是一個簡單的開發演示,在實際的工作中,代碼可能很複雜。因為這幾天在學習linux的IO多路復用機制,從網上找了一個稍微複雜的通信程式,代碼來自於博客https://www.cnblogs.com/Anker/p/3261006.html,源代碼有一處錯誤,需加上#include <arpa/inet.h>。這個程式的功能是客戶端向伺服器發送信息,伺服器接收輸出並原樣發送回給客戶端,客戶端接收到輸出到終端。其中使用一些linux中的庫文件。
問題1 無法找到庫文件
在博客https://www.cnblogs.com/xylc/p/6533716.html?&from=androidqq 看到一個解決方法,將ubuntu下麵/usr/include、/usr/local/include等目錄複製到vs的linux header path(在我的機器中,地址為C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\usr)。
問題2 gdbserver模式無法使用
vs2017進行調試有兩種方式,gdb和gdb-server,可以在菜單欄 調試->配置屬性->調試->調試模式中進行配置,關於這兩種模式的不同,官方文檔的解釋如下:
- 在“gdbserver”模式中,GDB 在本地運行,連接到在遠程系統上運行的 gdbserver。 請註意,這是 Linux 控制台視窗唯一支持的模式。
- 在“gdb”模式中,Visual Studio 調試器驅動遠程系統上的 GDB,如果 GDB 的本地版本與目標電腦上安裝的版本不相容,則遠程系統上的 GDB 更易相容。 |
從網上找了很多的資料,重新更新了ubuntu中的gdbserver,結果還是不行,因為我之前使用的是ubuntu17的server版本,無奈使用ubuntu14的桌面版,問題立馬得到解決,目前仍然不知道gdbserver模型為什麼無法使用,如果有路過的大神看到,希望評論區可以留言。
問題3 錯誤Stopped (tty input)
在運行gdb模式下運 行客戶端的時候,客戶端從控制台接受數據的那一段代碼報Stopped (tty input)錯誤,通過看官方文檔發現gdb模式不支持控制台交互,改成gdbserver模式後能正常使用。
最終運行結果
最終成功運行服務端和客戶端程式,先啟動服務端,再運行客戶端,下圖中分別為服務端和客戶端運行情況。當客戶端再控制台輸入信息,服務端能接收,並回傳給客戶端在控制台顯示。
參考資料
使用Visual Studio 2017作為Linux C++開發工具