ubuntu下vscode除錯開發踩過的坑
最近剛過安裝了中文版的ubuntu18.04.1,安裝完之後想在ubuntu上安裝vscode做c/c++的開發除錯,踩了不少坑,在此記錄一下,希望大家在這條路上不要再踩同樣的坑。
1.安裝vscode
安裝vscode很簡單,只需要一個命令即可搞定:
$ sudo apt-get install visual-studio-code
注:如果需要解除安裝,可使用 $ sudo apt-get remove code
安裝成功後,會在選單欄上出現vscode的標籤,如果沒有,則可以在terminal中使用命令./code開啟vscode
2.vscode使用過程的遇到的坑
安裝完vscode後,用vscode開啟程式碼工程目錄,並根據提示安裝c/c++外掛後,發現滑鼠無法跟蹤函式和成員變數的定義,即control+滑鼠單擊(或滑鼠右鍵)->Go to Definition時,提示no definition found for * 。被這個莫名其妙的問題搞得一頭霧水,百思不得其解。之前ubuntu16.04.4一直用的好好的,為什麼到了18.04.1就找不到函式定義了。
後來仔細看提示才發現,程式碼路徑裡面的資料夾名稱桌面是中文名(程式碼放在桌面目錄下),會不會是因為這個問題才導致vscode無法跟蹤函式定義呢?於是將ubuntu系統切成英文系統,切換方法如下:
1.開啟系統選單中的設定-》Region & Language
將language/語言 從中文改為English(United States)
將Formats/格式 從中國改為United States
然後重啟系統
2.重啟之後發現home目錄下除了中文的桌面目錄之外,還多了一個Desktop目錄,於是將中文桌面目錄下的所有資料夾剪下到Desktop目錄下,並檢查工程程式碼目錄下是否還有其他中文字元,有的話繼續改成英文。
3.使用vscode開啟工程資料夾目錄,然後再control+滑鼠單擊-》Go to Definition跟蹤函式定義,函式已經自動跳轉到函式的定義頁面。問題成功解決。
3.vscode除錯linux下的c/c++工程
3.1準備原始碼
準備原始碼main.cpp,程式碼如下:
#include <stdio.h> int main() { printf("vscode test debug\n"); int a = 3; int b = 2; int c = a*b; printf("a+b=%d\n",c); getchar(); return 0; }
3.2 vscode呼叫makefile編譯原始碼
為3.1的測試程式碼準備一個makefile檔案,內容如下:
TARGETNAME = build all:$(TARGETNAME) main.o:main.cpp g++ -g -O0 -Wall -fPIC -c $^ $(TARGETNAME):main.o g++ -o $@ $^ .PHONY:clean clean: rm -f $(TARGETNAME) main.o $ g++ -g -c test.cpp $ g++ -o test test.o
在terminal中make會生成build可執行檔案
3.3 建立vscode除錯配置檔案
使用vscode開啟test.cpp所在的資料夾目錄,按F5,彈出選擇除錯環境對話方塊(Select Environment),從對話方塊的下拉選單中選擇C++(GDB/LLDB),如下圖所示:
選擇後C++(GDB/LLDB)程式自動生成launch.json檔案,如下所示:
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit:https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "enter program name, for example${workspaceFolder}/a.out", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }
1)、將
"program": "enter program name, for example${workspaceFolder}/a.out",
改為:
"program": "${workspaceFolder}/test",
2)、將
"externalConsole": true,
改為:
"externalConsole": false,
3)、如果存在程式啟動引數,則將
"args": [],
改為:
"args": ["arg1","arg2", "arg3"],
3.4 使用vscode編譯makefile工程
進入.vscode目錄(隱藏檔案),建立tasks.json檔案。
內容如下所示:
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "make", //"args":["-g", "${workspaceRoot}/main.cpp","-o","build"], "problemMatcher": [ "$gcc" ] } ] }
儲存後按ctrl+shift+B進行編譯。編譯成功後會在當前目錄下生成名為build的可執行檔案。然後在程式碼中設定斷點,按F5即可進行除錯程式碼。
3.5 使用vscode編譯原始碼
進入.vscode目錄(隱藏檔案),建立tasks.json檔案。
內容如下所示:
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "g++", "args":["-g", "${workspaceRoot}/main.cpp","-o","build"], "problemMatcher": [ "$gcc" ] } ] }
儲存後按ctrl+shift+B進行編譯,編譯成功後即可進行除錯。
3.6 除錯
用vscode開啟原始碼,使用F9在需要除錯的地方設定斷點,按F5執行程式,便可以開始linux下程式的除錯,除錯方法與windows的vs開發環境幾乎完全一樣。
4.總結一下踩坑的經驗教訓
1、vscode的程式碼路徑不能有中文,否則會出現無法跟蹤程式碼定義的問題;
2、"externalConsole": 應該為false,否則無法進入除錯;fu
3、args為一個數組,而不是一個字串
4、tasks.json的label為編譯目標程式名稱,必須與launch.json的"program": " ${workspaceFolder}/$(programname)",中的$(programname)相同,否則除錯將出問題。
5、"command": "g++"為使用g++編譯,對於c++原始碼,"gcc"為使用gcc編譯,對應c原始碼,"make"對應makefile檔案編譯,原始碼工程目錄下必須有對應makefile工程