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工程