linux下调试C++程序一般用gdb或log的方式,gdb虽然能断点单步调试,但是纯命令行调试不够方便直观,vscode推出了远程调试的一些插件,可以方便的搭建linux下的C++开发、调试环境,下面就一步步打造linux的的开发环境吧
vscode环境配置
-
安装插件
Remote - SSH
,Remote - WSL
,Remote Development
,C/C++
,全部选微软官方的版本
-
添加要连接的远程机器,wsl和ssh的操作方式是一样的,只是ssh需要配置一下ssh登录,这个随便一搜就有了
-
这里我是连的本地的wsl版本的linux -
配置调试
从 Remote Explorer定位到你需要调试的工程的入口
-
在远程机器上安装vscode插件(此时我们的环境已经在远程机器上了)
-
把第一步的那些插件在远程机器上再装一遍,会有如上提示,告诉你这是装在wsl上的
远程linux机器配置
- 安装g++, make等一堆编译、调试工具,以Ubuntu为例
sudo apt install g++ make gdb
vscode调试配置
- 打开需要调试的工程的任意源文件后,(这里不打开一个文件的话,会报错),按下F5,选
gdb/lldb
那一栏
选择你的编译器,这里就按需选择了,我这里选的是g+±9
然后再你的在你的.vscode目录
下会出现两个文件,顾名思义,launch.json是启动调试的入口文件,task是其他子任务
launch.json配置
默认的长这样:
- program:调试的时候启动的程序路径,也就是你需要调试的程序路径,一般设置成你编译输出的路径即可(要定位到文件,不能只是目录),这里按需修改即可
- args:程序启动时的命令行参数,没有就留空
- cwd:程序运行的工作目录,按需修改,默认就是你按F5时当前的目录
- preLaunchTask:启动调试前的任务名称,一般就是编译了(如果是调试现有程序,就不需要这一步,可以直接删掉),这个后面将attach调试的时候再提
- miDebuggerPath:就是调试器的路径了,也就是刚才安装的gdb的路径,一般就是默认的路径
tasks.json
这个文件定义了一些任务,可以再launch.json中调用
默认长这样:
- lable就是任务名称了
- command:任务启动的命令,我们这里需要进行编译,所以命令就是g++的路径了,如果之前你选了其他编译器,自然就是其他编译器的路径
- args:命令的参数,这里就是g++的参数,
需要注意的是,不能在一个字符串中写多个命令选项,会报错,需要拆开
,比如:
因为这样的命令参数传递给g++后就变成了:
g++ "-Werror=format -std=c++17 -L. -lNanoLog -pthread -lrt"
正常g++的参数是不需要 引号的
正确的姿势:
愉快的调试吧
完整launch.jons:
{
// 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": "g++-9 - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/sampleApplication",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++-9 build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
完整task.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++-9 build active file",
"command": "/usr/bin/g++-9",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/sampleApplication",
"-I", "../runtime",
"-Werror=format", "-std=c++17",
"-L.", "-lNanoLog", "-pthread", "-lrt"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
打好断点,按下F5,就能像visualstudo中一样方便的调试了
使用make + makefile进行编译构建
上面我们使用的是g++进行编译的,但是很多开源项目都是用的make进行构建的,那我们来调整一下task.json,然他支持make;
其实经过上面的配置,我们能理解到,task.json其实就是配置一下构建的命令而已,所以我们把command修改为make
,args修改为make对于的命令参数
即可,
使用make要注意makefile的位置和工作路径的位置关系,不然容易出现找不到makefile的问题
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++-9 build active file",
"command": "make",
"args": [
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
launch.json、task.json中的一些预定义变量查询:
https://code.visualstudio.com/docs/editor/variables-reference