Ubuntu系统下用VSCode断点调试C++代码

news2024/11/26 18:27:29

文章目录

  • 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.hmaths.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;
以下比生成的多添加了 argsgroupargs是为了给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++代码。




须知少时凌云志,曾许人间第一流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++图形开发(9):静止的矩形(fillrectangle函数)

我们的graphics库提供了一个用于绘制矩形的函数&#xff0c;它就是…… fillectangle();其格式为&#xff1a; fillectangle(矩形左上角的x坐标,矩形左上角的y坐标&#xff0c;x方向的距离&#xff0c;y方向的距离);举个栗子&#xff1a; #include<graphics.h> #inclu…

Feign 调用报 RequestParam.value() was empty on parameter 0

详细报错: FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0 背景 最近在使用 RequestParam、RequestBody 注解定义 feign 接口的时候出现一些使用上的问题&#xff…

Ceph:关于Ceph 集群中数据分布和容灾理论的一些笔记

写在前面 准备考试&#xff0c;整理 Ceph 相关笔记博文内容涉及,Ceph 集群中数据如何分布以及不同的容灾池介绍理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有…

【MySQL系列】数据库基础学习_简单认识数据库

「前言」文章内容大致是数据库基础&#xff0c;以及数据库的基本知识。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 我见青山多妩媚&#xff0c;料青山、见我应如是。 ——辛弃疾《贺新郎》 目录 一、连接MySQL服务器二…

hcip第三次作业

1、合理规划IP地址&#xff0c;启用OSPF单区域。 2、R1-R2之间启用PPP的PAP单向认证。 把R1作为主认证方 然后在R2处做添加——帐号、密码 接口处于双UP的状态&#xff0c;证明认证成功 3、R2-R3之间启用PPP的chap双向认证 R2作为主认证方。 此时4/0/1口处于up - down状态 然…

Zabbix6.0 的部署、自定义监控服务

目录 一、概述 二、 zabbix 1.zabbix简介 2.zabbix监控原理 3. Zabbix 6.0 新特性 3.1Zabbix server高可用防止硬件故障或计划维护期的停机 3.2 Zabbix 6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统从多个维度采集指标 4. Zabbix 6.0 功能组件 4.1…

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:/

-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPathD:/在内存溢出时导出整个堆信息 指定导出堆的存放路径(D:/java_customName.hprof)&#xff0c;可以自定义dump名字&#xff1b;自定义名字时重复执行dump文件貌似不会覆盖(D:/)&#xff0c;只指定路径会自动生成Dump文件&…

10G CWDM和DWDM的优势和应用场景解析

10G CWDM和10G DWDM光模块都是用于光纤通信系统的传输技术&#xff0c;它们在光纤网络中使用不同的光波分复用技术。本期文章我们通过分析10G CWDM SFP和10G DWDM SFP两种光模块进行区别对比。 一、10G CWDM和DWDM光模块参数区别对比 二、易天光通信10G CWDM和DWDM光模块优势对…

品牌从0到1,中小企业如何在市场中脱颖而出?

道叔在初创小企业做过品牌&#xff0c;所以对这一块很清楚。在资金有限的中小企业做品牌&#xff0c;并不需要在品牌建设上砸钱&#xff0c;没钱也不是不可以做品牌&#xff0c;不花钱有不花钱的做法。 以下是个人在小企业做品牌的一些实际操作经验&#xff0c;都是干得不能再…

【UnitDOTS 小知识】ChunkComponet存储

ChunkComponet存储 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、ChunkComponet的特点 按ChunkComponent按Chunck存储的&#xff0c;他…

C4D和3dmax在不同应用场景下对比,哪个更好用

Maxon Cinema 4D 和Autodesk 3ds Max 是艺术家和工作室在许多领域经常使用的两种最著名的 3D 软件。它们都有不同的功能&#xff0c;在本文中&#xff0c;让我们对它们进行比较。我们将尽力向您概述它们之间的主要区别以及两者的能力。 哪一个更容易使用/学习&#xff1f; Ci…

Java 基础入门篇(四):方法的重载与参数传递机制

文章目录 一、方法的定义二、方法的参数传递机制 ★2.1 基本类型的参数传递2.2 引用类型的参数传递三、方法重载 一、方法的定义 方法的作用&#xff1a;封装一段代码的语法结构&#xff0c;可以被重复调用&#xff0c;以此提高代码的复用性&#xff0c;提高开发效率&#xff0…

无线传感器:智能家居监控系统设计

创造声明&#xff1a;本文档由北溪入江流与砂砾共同协作完成 一&#xff1a;选题理由 1.1 市场分析 随着经济的发展&#xff0c;人们的生活水平提高&#xff0c;人们对家庭居住的环境&#xff0c;安全性和智能性需求越来越高&#xff0c;越来越多的人开始关注智能家居系统。智…

FANUC机器人MEMO-126故障报警,无更多可用TPP内存的处理方法

FANUC机器人MEMO-126故障报警&#xff0c;无更多可用TPP内存的处理方法 如下图所示&#xff0c;示教器上报警提示“MEMO-126 无更多可用TPP内存”&#xff0c; 检查系统TPP存储空间是否够用&#xff0c;如下图所示&#xff0c;依次找到MENU—状态—存储器&#xff0c; 如下…

SSM项目前后端分离+IDEA运行环境(含前端源码)(个人博客系统)

目录 后端项目环境配置 1、创建一个SpringBoot项目&#xff0c;添加MyBatis框架和数据库MySQL驱动依赖 2、配置项目文件&#xff1a;application.yml 3、创建数据库表 4、创建分层结构目录 返回统一数据格式 创建统一数据格式返回类&#xff1a;AjaxResult 创建实现统一…

两款免费好用的OPCUA服务端模拟器

一、OPC UA服务器1 1、下载 https://download.csdn.net/download/qq_43445867/87967458 2、安装完打开即可开启opc服务 另外此软件还可以模拟一些变量变化 二、OPC UA服务器2 1、测试opc服务器 启动Softing OPC Client输入连接信息后可以看到已经连接到OPC服务器 Softing …

企业内容管理升级 3.0:构建生态协同,助力合规成长

企业内容管理曾一度火热&#xff0c;但其早期方案似乎已过时。实际上,随着企业数字化转型的加深,企业内容管理也在不断演进&#xff0c;陪伴着企业数字化成长。 企业内容管理3.0 企业内容管理1.0实现企业无纸化&#xff0c;提高业务运营效率。以电子影像技术为主,使纸质文件电…

手撕spring03源码

概述 传入对象参数通过cglib实例化代理对象整体设计 知识补充 /**** param beanDefinition* param beanName* param ctor 构造方法* param args 参数* return* throws BeansException*/Overridepublic Object instantiate(BeanDefinition beanDefinition, String beanName, C…

安达发|APS车间排产软件生产计划优化利器

APS车间排产软件是一款专门针对制造企业的生产计划排程优化软件。它可以帮助企业实现优化排程和提高生产效率。具体来说&#xff0c;它能够解决企业面临的多种复杂问题&#xff0c;包括&#xff1a; 1. 优化排产计划&#xff0c;避免设备闲置和资源浪费。通过对订单和产能的预…