Linux下开发调试C++代码的三种方法

news2024/12/22 22:23:20

目录

  • 准备程序
  • 配置vscode的json文件调试
  • 使用GDB命令行调试
  • 使用core文件调试

一般来说,Linux下做C++开发都是用vscode远程连接的方式,这时候调试有三种方式:配置vscode的json文件调试GDB命令行调试通过core文件调试

关于这三种调试方法的示例都是基于cmake开发下,也适用不用cmake开发的情况,就不一一演示了,道理都是相通的。

准备程序

在这里插入图片描述这是项目的整个目录,初始只有三个文件,main.cpp、sum.h、CMakeLists.txt

// main.cpp

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <string.h>

#include "sum.h"

int main(int argc, char** argv)
{
    int a = std::stoi(argv[1]);
    int b = std::stoi(argv[2]);

    std::cout << sum(a, b) << std::endl;

    std::unordered_map<int, int> mp;
    mp.insert({ 1, 2 });

    std::cout << mp[1] << std::endl;

    std::vector<int> vec;
    vec.push_back(1);

    std::cout << vec[0] << std::endl;

    return 0;
}
// sum.h

#pragma once

#include <iostream>

int sum(int a, int b)
{
    for (int i = 0;i < 10;i++)
        a += b + i;

    return a;
}
// CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(main)

# 添加调试信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11")

# 链接头文件
include_directories(${PROJECT_SOURCE_DIR}/include)

# 链接cpp文件
add_executable(main ./src/main.cpp)

# 生成可执行程序到bin目录下
set_target_properties(main PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin"
)

配置vscode的json文件调试

通过vscode配置json文件调试其实只需要一个launch.json文件即可,tasks.json是用来生成编译的,但是我们在linux下做开发要么用cmake命令编译,或者g++命令行编译,所以这个文件可以不需要。

第一步
打开main.cpp进行操作,其他文件不行。
第二步
点击 运行 -》添加配置 -》选择C++(GDB/LLDB)
在这里插入图片描述在这里插入图片描述这样就会在.vscode下生成一个launch.json文件

在这里插入图片描述在这里插入图片描述在这里插入图片描述
我们主要关心箭头指向的两个参数,
program:可执行程序的路径+名称
args:调试时需要给main函数传入的参数

我们这个程序的可执行文件会生成在bin目录下,调试时我们传入的参数为1、2,所以我们这个文件就可以这样写:

在这里插入图片描述打开终端,通过cmake命令生成可执行文件。

cd build
cmake ..
make

之后就可以在main函数里打断点,点击F5或者运行-》启动调试 开始调试。

在这里插入图片描述
左侧会自动监视变量的值,可以看到a和b的值是我们传进去的1和2。

使用GDB命令行调试

推荐一些常用的GDB调试命令:

1、编译项目时添加-g选项,可执行程序会带有调试信息
2、gdb + 可执行程序文件名 开始调试程序
3、调试技巧

  • 打断点:
    1、break 文件名:行号
    2、break 类名称::方法名

  • 启动调试
    1、start:从main函数第一行代码开始执行
    2、run:程序开始执行直到命中断点

  • 查看断点:info break

  • 查看代码,默认查看十行:list,简写l

  • 查看调用堆栈:backtrace,简写bt

  • 打印变量名:print 变量名,简写 p 变量名

  • 进入函数:step,简写s

  • 单步调试:next,简写n

  • 设置main传入的参数:set args 1 2,传入的参数为1和2

  • 继续执行直到下一个断点或程序结束:continue,简写c

  • 取消断点:clear + 断点编号clear + 文件名:行号

  • 退出:quit

在这里插入图片描述在这里插入图片描述

使用core文件调试

使用core文件调试适用于程序挂掉的情况下,我们修改一下main.cpp的代码,让程序挂掉。

// main.cpp

#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
#include <string.h>

#include "sum.h"

int main(int argc, char** argv)
{
    int a = std::stoi(argv[1]);
    int b = std::stoi(argv[2]);

    std::cout << sum(a, b) << std::endl;

    std::unordered_map<int, int> mp;
    mp.insert({ 1, 2 });

    std::cout << mp[1] << std::endl;

    char* p = nullptr;
    strcpy(p, "hello world");	// 让程序挂掉

    return 0;
}

1、使用ulimit命令生成core文件并控制大小,使用以下命令将core文件大小设置为无限制,运行程序,会在bin目录下生成core文件

ulimit -c unlimited

在这里插入图片描述
2、gdb + 可执行程序名 + core文件名 调试

在这里插入图片描述可以看到它在main.cpp的第22行挂掉,该行的代码是

strcpy(p, "hello world");

因为我们给一个空指针拷贝内容,程序崩溃。

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

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

相关文章

ssm停车场管理系统

点赞收藏关注 → 私信领取本源代码、数据库 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于停车场管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了停…

【PHP编程使用UI框架】——GET和POST的请求方法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

VIVADO IBERT学习

V7的IBERT可以用来测试误码&#xff0c;但是使用中有诸多限制&#xff0c;例化工程测试下效果。 1.IP中例化一个IBERT 2.QUAD代表包含几个4lane的PLL&#xff0c;因为QPLL下面挂4个lane&#xff0c;一个bank包含4条&#xff0c;所以就是bank数量。如果协议层例化为2个&#x…

SQLite版本3中的文件锁定和并发(七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;自己编译SQLite或将SQLite移植到新的操作系统&#xff08;六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 正文&#xff1a; 1.0 SQLite 版本 3 中的文件锁定和并发 SQLite 版本 3.0.0 引入了新的锁…

MySQL(常用函数、多表查询)

文章目录 1.数据库函数1.count函数案例答案count&#xff08;*&#xff09;与count&#xff08;列&#xff09;的区别 2.sum函数案例答案 3.avg函数案例答案 4.max/min函数案例答案 5.group by 分组统计案例答案 6.字符串相关函数演示练习 7.数学相关函数演示 8.日期相关函数演…

基于java+springboot+vue实现的付费自习室管理系统(文末源码+Lw+ppt)23-400

摘 要 付费自习室管理系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的java进行编写&#xff0c;使用了springboot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对用户…

Chatopera 云服务的智能问答引擎实现原理,如何融合 #聊天机器人 技术 #Chatbot #AI #NLP

观看视频 Bilibili: https://www.bilibili.com/video/BV1pZ421q7EH/YouTube: https://www.youtube.com/watch?vx0d1_0HQa8o 内容大纲 提前在浏览器打开网址&#xff1a; Chatopera 云服务&#xff1a;https://bot.chatopera.comChatopera 入门教程&#xff1a;https://dwz…

武汉星起航:发挥亚马逊平台优势,助力合作伙伴带来成功和机遇

在数字化浪潮席卷全球的今天&#xff0c;跨境电商已成为连接全球市场的桥梁和纽带。亚马逊平台作为全球最大的电商平台之一&#xff0c;以其丰富的商品类别、强大的营销工具和精准的数据分析功能&#xff0c;为卖家提供了广阔的商业空间。在这个充满机遇和挑战的市场背景下&…

【C语言】自定义类型:联合体和枚举

1. 联合体 1.1 联合体的特点 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间所以联合体也叫&#xff1a;共⽤体。 union Un {char…

代码随想录第二十三天|● 669. ● 108. ● 538. ● 总结篇

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

Trimble Business Center 2023.11crack 一机一码

1.整体解决方案套件&#xff1a;TBC 不仅仅是基线处理。它提供了一整套 GNSS 数据处理工具。无论是地形数据、卫星图像还是复杂的地理空间计算&#xff0c;TBC 都能满足。这种集成方法消除了对多个软件的需求&#xff0c;使流程更加高效。 2.以用户为中心的设计理念&#xff1a…

pytest--python的一种测试框架--pytest常用断言类型

一、pytest常用断言类型 等于: 不等于&#xff1a;&#xff01; 大于&#xff1a;> 小于&#xff1a;< 属于&#xff1a;in 不属于&#xff1a;not in 大于等于&#xff1a;> 小于等于&#xff1a;< 是&#xff1a;is 不是&#xff1a;is not def test_two():ass…

自用Proteus(8.15)仿真下载安装过程(附详细安装过程图)

文章目录 一、前言二、软件下载三、安装过程1.软件下载完成&#xff0c;进行解压缩2.右键点击Setup&#xff0c;以管理员身份运行3.点击Next&#xff0c;进行下一步4.勾选I accept...&#xff0c;点击Next5.选择使用本地安装的许可秘钥6.点击Next&#xff0c;进行下一步7.无需勾…

CSS使用clip-path实现元素动画

前言&#xff1a; 在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 目录 前言&#xff1a; clip-path到底是什么&#xff1f; clip-pa…

读所罗门的密码笔记06_共生思想(上)

1. 共生思想 1.1. 1997年5月11日&#xff0c;IBM公司的“深蓝”计算机在与国际象棋世界冠军加里卡斯帕罗夫的第二次对弈时击败了他 1.1.1. 这台超级计算机以3.5∶2.5的战绩胜出&#xff0c;登上了世界各地的新闻头条 1.2. Alpha Zero 1.2.…

赋值语句还能当判断条件?涨芝士了!

赋值和条件看似是C语言中毫不相关的两个概念&#xff0c;虽然实际过程中我猜测不会有太多这种不太符合常理的情况出现&#xff0c;但是现在在学习的过程中&#xff0c;为了出题而出题总是会整出一些花活出来.....这很难不让人联想起高中时一些大佬为了彰显自己的数学天赋而自己…

代码学习第32天---动态规划

随想录日记part32 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.30 主要内容&#xff1a;今天开始要学习动态规划的相关知识了&#xff0c;今天的内容主要涉及两个方面&#xff1a; 不同路径 &#xff1b; 不同路径 II。 62.不同路径 63. 不同路径 II 动态…

Linux学习之软硬链接及动静态库

前言&#xff1a;在之前的文章http://t.csdnimg.cn/Lru5Thttp://t.csdnimg.cn/Lru5T 我们已经对Linux 系统里面的文件具有一定的理解了&#xff0c;现在我们将继续学习Linux里面的软硬连接和动静态库&#xff0c;这些是Linux里面的一些重要内容。 目录 一&#xff0c;文件管…

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时&#xff0c;HouseHolder变换…

【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接

基本全景拼接 panorama_stitching_rotating_camera.cpp 将第二张图像进行透视变换后与第一张图像拼接 #include <iostream> // 包含了一些用于输入输出的函数 #include <opencv2/core.hpp> // 包含了OpenCV核心库的一些常用类和函数 #include <opencv2/imgpro…