文章目录
- 0 引言
- 1 创建vsdebug工程
- 1.1 创建文件夹和文件
- 1.2 C++代码
- 1.3 CMakeLists.txt
- 1.4 build.sh脚本
- 2 VSCode配置文件
- 2.1 tasks.json
- 2.2 launch.json
- 3 编译运行和调试
- 3.1 编译运行
- 3.2 调试
0 引言
Ubuntu下不能像Windows下使用Visual Studio那样方便Debug调试C++代码,所以学习记录一种用VSCode断点调试C++代码的方法。
默认已在Ubuntu下安装了VSCode
以下示例工程vsdebug文件夹下的文件目录:
# vsdebug文件夹下
.
├── build.sh
├── CMakeLists.txt
├── include
│ └── maths.h
├── src
│ ├── main.cpp
│ └── maths.cpp
└── .vscode
├── launch.json
├── settings.json
└── tasks.json
1 创建vsdebug工程
1.1 创建文件夹和文件
# 新开终端,比如home目录下
mkdir vsdebug
cd vsdebug
mkdir include src
touch CMakeLists.txt build.sh
touch include/maths.h src/main.cpp src/maths.cpp
然后把这个vsdebug
工程在VSCode中打开。
1.2 C++代码
整体示例代码为了实现打印出1~9
的平方和立方,其中输入一个数返回这个数的平方和立方的函数在maths.h
和maths.cpp
实现,调用函数计算1~9
的平方和立方在main.cpp实现。
打开maths.h
,声明f1, f2
函数:
#ifndef MATHS_H_
#define MATHS_H_
double f1(double a);
double f2(double b);
#endif /* MATHS_H_ */
打开maths.cpp
,定义f1 , f2
函数:
#include "maths.h"
// 平方计算
double f1(double a)
{
return a * a;
}
// 立方计算
double f2(double b)
{
return b * b * b;
}
打开main.cpp
,调用f1, f2
函数:
#include <iostream>
#include "maths.h"
int main()
{
for(double i = 1.0; i < 10.0; i++ ){
double x = f1(i);
double y = f2(i);
std::cout << i << " 的平方:" << x << std::endl;
std::cout << i << " 的立方:" << y << std::endl;
}
return 0;
}
1.3 CMakeLists.txt
CMakeLists.txt
文件如下:
cmake_minimum_required(VERSION 2.8)
project(vsdebug)
# 设置Debug调试模式,或Release模式
set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_BUILD_TYPE "Release")
# -O3是一个优化选项,告诉编译器优化我们的代码。
# gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化
set(CMAKE_CXX_FLAGS "-O3")
# 设置编译模式
set(CMAKE_CXX_STANDARD 11)
# 设置lib路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 设置bin路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 包含include中的头文件
include_directories(
${PROJECT_SOURCE_DIR}/include/
)
# 包含src中函数实现的cpp文件,生成动态链接库
add_library(${PROJECT_NAME} SHARED
src/maths.cpp
)
# 添加main.cpp,编译成可执行文件
add_executable(main
src/main.cpp)
# main可执行文件添加链接库
target_link_libraries(main ${PROJECT_NAME})
1.4 build.sh脚本
build.sh 脚本主要为了自动执行 cmake make
编译
#!/bin/bash
if [ ! -d "build" ]; then
mkdir build
else
rm -rf build/*
fi
cd build
Local_Dir=$(cd "$(dirname "$0")"; pwd)
echo "Now work at Dir: $Local_Dir"
cmake ..
make
2 VSCode配置文件
2.1 tasks.json
tasks.json
文件相对于VSCode的.sh
文件,可设置如何编译文件,运行文件
VScode中摁 Ctrl+Shift+p
打开控制台,输入Tasks:Configure Task
,再选择Create tasks.json file from templates
,最后选择Other
,就在vsdebug
工程下自动生成了 .vscode
文件夹及文件夹中的 tasks.json
文件
把生成的label
修改成工程名 vsdebug
;
以下比生成的多添加了 args
,group
,args
是为了给main
函数传参,group
中的 build
是为了自动执行command
中的命令,所以 command
修改成 bash ./build.sh
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "vsdebug",
"type": "shell",
"command": "bash ./build.sh",
"args": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
2.2 launch.json
VSCode中launch.json
文件主要是设置如何调试,直接点击左侧边栏的Run and Debug
图标,点击create a launch.json file
,选择C++(GDB/LLDB)
,选择Default Configuration
,就能自动生成launch.json
文件。
一般情况下只需要改program
部分内容改为项目路径下生成的执行文件即可,如果需要调试前重新编译一遍,可以新增一条preLaunchTask
,内容改为tasks.json
中的label
名称,这里修改成vsdebug
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/main", //只修改这里
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "vsdebug" // 可以新增一条
}
]
}
3 编译运行和调试
3.1 编译运行
因为已经把mkdir build && cd build
, cmake ..
, make
编译三件套写到 build.sh中,所以可以直接执行:
# 第一次给可执行权限
sudo chmod +x build.sh
bash build.sh
编译运行后的结果,打印出:
1 的平方:1
1 的立方:1
2 的平方:4
2 的立方:8
3 的平方:9
3 的立方:27
4 的平方:16
4 的立方:64
5 的平方:25
5 的立方:125
6 的平方:36
6 的立方:216
7 的平方:49
7 的立方:343
8 的平方:64
8 的立方:512
9 的平方:81
9 的立方:729
3.2 调试
VSCode调试可以直接摁F5
,或者点击VSCode的运行–>运行调试,调试前可先设定断点,比如在main
函数中给double y = f2(i);
设置断点,也可以把某个变量添加到监视中,比如对main
函数中的 i
添加监视,执行调试后,可以执行 单步跳过调试
或 单步调试
至此,成功在Ubuntu系统中用VSCode断点调试C++代码。