ubuntu下vscode調試開發踩過的坑

最近剛過安裝了中文版的ubuntu18.04.1,安裝完以後想在ubuntu上安裝vscode作c/c++的開發調試,踩了很多坑,在此記錄一下,但願你們在這條路上不要再踩一樣的坑。

1.安裝vscode

  安裝vscode很簡單,只須要一個命令便可搞定:
$ sudo apt-get install visual-studio-code
  注:若是須要卸載,可以使用 $ sudo apt-get remove codelinux

安裝成功後,會在菜單欄上出現vscode的標籤,若是沒有,則能夠在terminal中使用命令./code打開vscodec++

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跟蹤函數定義,函數已經自動跳轉到函數的定義頁面。問題成功解決。shell

3.vscode調試linux下的c/c++工程

3.1準備源碼

  準備源碼main.cpp,代碼以下:json

#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文件,內容以下:ubuntu

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可執行文件windows

3.3 建立vscode調試配置文件

  使用vscode打開test.cpp所在的文件夾目錄,按F5,彈出選擇調試環境對話框(Select Environment),從對話框的下拉菜單中選擇C++(GDB/LLDB),以下圖所示:
clipboard.png
  選擇後C++(GDB/LLDB)程序自動生成launch.json文件,以下所示:visual-studio-code

{
    // 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)、將visual-studio

"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.總結一下踩坑的經驗教訓

一、vscode的代碼路徑不能有中文,不然會出現沒法跟蹤代碼定義的問題;二、"externalConsole": 應該爲false,不然沒法進入調試;fu三、args爲一個數組,而不是一個字符串四、tasks.json的label爲編譯目標程序名稱,必須與launch.json的"program": " ${workspaceFolder}/$(programname)",中的$(programname)相同,不然調試將出問題。五、"command": "g++"爲使用g++編譯,對於c++源碼,"gcc"爲使用gcc編譯,對應c源碼,"make"對應makefile文件編譯,源碼工程目錄下必須有對應makefile工程

相關文章
相關標籤/搜索