在Linux系统下使用GDB调试C++程序【命令行调试与vscode编译器调试】

文章目录

  • 1. Linux下编译器,调试器安装
  • 2. GDB调试器介绍
    • 1. 概述
    • 2. 常用调试命令参数
  • 3. Linux下C++命令行调试实战
    • 0. 安装超级终端Terminator
    • 1. 准备代码
    • 2. 进入调试模式
    • 3. 调试过程
  • 4. Linux下vscode使用cmake和gdb:
  • 5. 补充:关于vscode的一些标识和快捷键

1. Linux下编译器,调试器安装

sudo apt update

sudo apt install build-essential gdb //安装三个软件

查看安装是否成功

gcc --version
g++ --version
gdb --version

2. GDB调试器介绍

1. 概述

  • GDB(GNU Debugger) 是一个用来调试 C/C++ 程序的功能的调试器,是Linux系统开发C/C++最常用的调试器

  • 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量

  • Linux开发C/C++一定要熟悉GDB

  • VScode是通过调用GDB调试器来实现C/C++调试工作的,而vscode可以在linux和windows环境下运行

Windows中,常用的集成开发环境,如VS,VC等已经内嵌了相应的调试器

GDB的主要功能:

  • 设置断点(断点可以是条件表达式)
  • 使程序在指定的代码上暂停执行,便于观察
  • 单步执行程序,便于调试
  • 查看程序中变量值的变化
  • 动态改变程序的执行环境
  • 分析崩溃程序产生的core文件

2. 常用调试命令参数

调试开始:执行gdb [exefilename],进入gdb调试程序,其中exfilename为要调试的执行文件名,以下命令后括号内为命令的简化使用,比如 run(r),直接输入命令 r 就代表命令 run

help(h) #查看命令帮助,具体命令查询在gdb 中输入help + 命令
run(r) #重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)
start(s) #单步执行,运行程序,停在第一行执行语句
list(l) #查看源代码(list-n从第n行开始查看代码。list+函数名:查看具体函数)
set #设置变量的值
next(n) #单步调试(逐过程,函数直接执行)
step(s) #单步调试(逐语句,跳入自定义函数内部执行)
backtrace(bt) #查看函数的调用栈帧和层级关系
frame(f) #切换函数的栈帧
info(i) #查看函数内部局部变量的数值
finish #结束当前函数,返回到函数调用点
continue(c) #继续执行
print(p) #打印值及地址
quit(q) #退出gdb
break + num(b) #在某行达断点
info + breakpoints #查看当前设置的所有断点
delete + breakpoints num(d) #删除第num个断点
display #跟踪查看具体的变量值
undisplay #取消跟踪观察变量
watch #被设置观察点的变量发生修改时,打印显示
i watch #显示观察点
enable breakpoints #启用断点
disable breakpoints #禁用断点
x #查看内存x/20xw 显示20个单元,16进制,4个字节没单元
run argv[1] argv[2] #调试命令传参
set follow-fork-mode child #Makefile项目管理,选择跟踪父子进程(fork)
  1. 编译源代码时需要加上 -g ,产生的可执行文件才能用 gdb 进行调试,例如:gcc -g main.cpp -o main
  2. 回车键:重复上一条命令

3. Linux下C++命令行调试实战

0. 安装超级终端Terminator

sudo apt install terminator

具体使用方法可以查看博文:第七章:超级终端Terminator

1. 准备代码

创建一个C++源代码文件 src/04_debug/sum.cpp,添加以下代码

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
    int N = 100;
    int sum = 0;
    int i = 1;
    
    while(i <= N){
        sum = sum + i;
        i = i + 1;
    }
    
    cout << "sum = " << sum <<endl;
    cout << "The program is over " <<endl;
    
    return 0;
}

2. 进入调试模式

在进入调试模式之前,先编译源代码,如下过程。

普通编译方式

g++ sum.cpp -o no_g.out

编译出用于调试的可执行文件

g++ -g sum.cpp -o yes_g.out

使用gdb命令进行调试,如果我们调试 no_g.out ,将会提示错误。因为no_g.out这个可执行文件不包含用于调试的信息,输入quit再按回车即可,通过gdb yes_g.out指令执行包含调试信息的可执行文件,看到以下输出
在这里插入图片描述

此时可以正常进入调试

3. 调试过程

直接执行

run

或者使用简写r,运行结果如下图

在这里插入图片描述

在第11行打断点

break 11

运行结果如下图
在这里插入图片描述

也可以使用简写的方式,在第12行打断点

b 12

结果如下图

在这里插入图片描述

使用info breakpoints指令或者指令简写i b查看当前的断点,如下图结果

在这里插入图片描述

使用run指令或者r指令执行程序,此时命中了第11行断点,如下图内容

在这里插入图片描述

此时可以查看变量的值,如查看i的值,可以使用print i或者p i指令,如下图

在这里插入图片描述

此时程序执行到第11行处,如果我们需要继续执行,输入continue指令并按回车即可,程序将执行到代码的第12行,如下图

在这里插入图片描述

因为我们是在while循环体内,i的值将不断变化,如果我们需要跟踪i值的变化,需要输入display i指令即可,再输入continue指令让程序单步执行,每次都会打印i的值,如下图

在这里插入图片描述

可以观察到,通过循环,又回到了第一个断点,此时i的值已经变成了2。在gdb调试中,如果我们只按回车键,gdb将执行我们最后一次输入的指令,所以我们可以一直按回车键继续让程序单步执行。

当断点执行都某个位置时,我们想要查看断点附近5行的代码,可以执行list指令进行查看,如下图

在这里插入图片描述

4. Linux下vscode使用cmake和gdb:

  1. vscode中安装插件:cmake tools插件,cmake插件。C/C++ 插件

  2. 书写CMakeLists.txt,编译得到可执行文件:具体步骤查看博文:3.7.1 外部构建方式举例,然后调试通过CMake编译得到的可执行文件

  3. 注意,在CMakeLists.txt文件中不要优化编译-O2,与调试会发送冲突,并添加可调试指令
    在这里插入图片描述

  4. 点击左侧调试按钮,选择编译环境
    在这里插入图片描述

  5. 选择配置
    在这里插入图片描述

  6. 此时显示launch.json文件,替换program属性值为需要调试的可执行文件【绝对路径】
    在这里插入图片描述

参数解释:preLaunchTask: 该参数定义调试器启动之前的执行任务。默认配置文件中可能并不包含该参数,我们需要手动添加,用于自动编译变更后的 C++ 代码。该字段的功能是根据taks.json文件自动编译新的可执行文件。tasks.json文件的目的就是做调试之前的编译工作,程序员无须反复编译

  1. 通过 terminal -> Configure Default Build Task 菜单,并选择 Create tasks.json file from template -> Others 选项创建任务配置文件,文件创建位置为 .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": "echo",
            "type": "shell",
            "command": "echo Hello"
        }
    ]
}

如:在build文件路径下自动执行camke和make指令。我们需要将任务配置文件修改为如下内容,

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}/build"
    },
    "tasks": [
        {
            "type": "shell",
            "label": "cmake",
            "command": "cmake",
            "args": [
                ".."
            ]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "make",
            "args": []
        },
        {
            "label": "build",
            "dependsOrder": "sequence",
            "dependsOn": [
                "cmake",
                "make"
            ]
        }
    ],
}

同时也要修改launch.json中的preLaunchTask字段:
在这里插入图片描述

  1. 此时再按下F5就会自动化调试,不用手动编译,会生成新的可执行文件进行调试

5. 补充:关于vscode的一些标识和快捷键

换行符的区别
在这里插入图片描述

高频使用快捷键:

在这里插入图片描述
在 Ctrl+P 窗口下还可以:

  • 直接输入文件名,跳转到文件

  • ? 列出当前可执行的动作

  • ! 显示 Errors或 Warnings,也可以 Ctrl+Shift+M

  • : 跳转到行数,也可以 Ctrl+G 直接进入

  • @ 跳转到 symbol(搜索变量或 者函数),也可以 Ctrl+Shift+O 直接进入

  • @ 根据分类跳转 symbol,查找属性或函数,也可以 Ctrl+Shift+O 后输入:进入

  • #根据名字查找 symbol,也可以 Ctrl+T

快捷键:编辑器与窗口管理

  • 打开一个新窗口:Ctrl+Shift+N

  • 关闭窗口:Ctrl+Shift+W

  • 同时打开多个编辑器(查看多个文件)

  • 新建文件 Ctrl+N

  • 文件之间切换 Ctrl+Tab

  • 切出一个新的编辑器(最多 3 个) Ctrl+\,也可以按住 Ctrl 鼠标点击 Explorer 里的文件名

  • 左中右 3 个编辑器的快捷键 Ctrl+1 Ctrl+2 Ctrl+3

3 个编辑器之间循环切换 Ctrl+

  • 编辑器换位置, Ctrl+k然后按 Left或 Right
    ↓ 代码编辑相关的快捷键 ↓

快捷键:格式调整

  • 代码行缩进 Ctrl+[ 、 Ctrl+]

  • Ctrl+C 、 Ctrl+V 复制或剪切当前行/当前选中内容

  • 代码格式化:Shift+Alt+F,或 Ctrl+Shift+P 后输入 format code

  • 上下移动一行:Alt+Up 或 Alt+Down

  • 向上向下复制一行:Shift+Alt+Up 或 Shift+Alt+Down

  • 在当前行下边插入一行 Ctrl+Enter

  • 在当前行上方插入一行 Ctrl+Shift+Enter

快捷键:光标相关

  • 移动到行首:Home

  • 移动到行尾:End

  • 移动到文件结尾:Ctrl+End

  • 移动到文件开头:Ctrl+Home

  • 移动到定义处:F12

  • 定义处缩略图:只看一眼而不跳转过去 Alt+F12

  • 移动到后半个括号:Ctrl+Shift+]

  • 选择从光标到行尾:Shift+End

  • 选择从行首到光标处:Shift+Home

  • 删除光标右侧的所有字:Ctrl+Delete

  • 扩展/缩小选取范围:Shift+Alt+Left 和 Shift+Alt+Right

  • 多行编辑(列编辑):Alt+Shift+鼠标左键,Ctrl+Alt+Down/Up

  • 同时选中所有匹配:Ctrl+Shift+L

  • Ctrl+D 下一个匹配的也被选中 (在 sublime 中是删除当前行,后面自定义快键键中,设置与 Ctrl+Shift+K 互换了)

  • 回退上一个光标操作:Ctrl+U

快捷键:重构代码

  • 找到所有的引用:Shift+F12

  • 同时修改本文件中所有匹配的:Ctrl+F12

  • 重命名:比如要修改一个方法名,可以选中后按 F2,输入新的名字,回车,会发现所有的文件都修改了

  • 跳转到下一个 Error 或 Warning:当有多个错误时可以按 F8 逐个跳转

  • 查看 diff:在 explorer 里选择文件右键 Set file to compare,然后需要对比的文件上右键选择 Compare with file_name_you_chose

快捷键:查找替换

  • 查找 Ctrl+F

  • 查找替换 Ctrl+H

  • 整个文件夹中查找 Ctrl+Shift+F

快捷键:显示相关

  • 全屏:F11

  • zoomIn/zoomOut:Ctrl +/-

  • 侧边栏显/隐:Ctrl+B

  • 显示资源管理器 Ctrl+Shift+E

  • 显示搜索 Ctrl+Shift+F

  • 显示 Git Ctrl+Shift+G

  • 显示 Debug Ctrl+Shift+D

  • 显示 Output Ctrl+Shift+U

固定打开的文件

  • 双击标题栏或文件栏中的文件

参考博文:基于VSCode和CMake实现C/C++开发 | Linux篇

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT遭多国调查,OpenAI凌晨就安全问题发文,GPT-5要暂缓?

最近&#xff0c;意大利宣布禁用 ChatGPT&#xff0c;因为 OpenAI 违反了意大利相关的隐私规则和数据保护法&#xff0c;出现了用户数据丢失情况&#xff0c;而且未向用户告知。 消息出来后&#xff0c;德国、法国、爱尔兰、西班牙等国的监管部门都表示正在密切关注 ChatGPT 的…

“智慧”的大楼,为啥落地这么难?

在5A级写字楼上班是什么感觉?      当你加班至凌晨,灯光和空调系统仍然会为你继续服务。      当你进入停车场,系统会自动引导至方便停车的空位。      当你点完外卖但无法抽身时,送餐机器人便会将午饭送到公司门口。    所谓5A,就是指建筑的高度智能化,它包含…

SND0611支持PWM调光功能的线性恒流LED驱动芯片 完美代替SLM411A 用于在各种LED照明产品

深力科电子SND0611支持PWM调光功能的线性恒流LED驱动芯片 完美代替SLM411A 用于在各种LED照明产品 SND0611 系列产品是用于产生单通道、高精度恒 流源的 LED 驱动芯片&#xff0c;在各种 LED 照明产品中 非常简单易用。具有宽输入电压范围、高输出精度、超 低 drop-out 压降、…

Python网络爬虫进阶扩展

学习爬虫不是一天就能学会的&#xff0c;得循序渐进的慢慢学透了&#xff0c;才能更好的做爬虫相关的工作。下面的爬虫有关的有些知识点肯定要学会。 1、如何使scrapy爬取信息不打印在命令窗口中 通常&#xff0c;我们使用这条命令运行自己的scrapy爬虫&#xff1a; scrapy c…

算法风险防控

算法风险防控是指在算法应用过程中&#xff0c;通过对算法应用场景、数据、模型和结果等多个方面的风险进行评估和控制&#xff0c;以保障算法应用的安全性、可靠性和合法性。以下是一些常见的算法风险防控措施&#xff1a; 数据风险防控&#xff1a;在算法应用中&#xff0c;…

Shader Graph6-Dot Product节点(中)

一、Dot Product可以实现褪色的效果&#xff0c;等价与desaturation节点&#xff0c;据说性能比直接使用Desaturation节点有提升&#xff0c;未经过测试。 打开Unity&#xff0c;新建Shader Graph&#xff0c;x0.2126&#xff0c;y0.7152x&#xff0c;z0.0722 UE中是这样的 二…

linux 远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法乱码

网上有两种解决办法&#xff0c;一种就是升级sqlyog&#xff0c;一种是修改mysql默认身份验证插件。 升级SQLyog 第一种就不用说了&#xff0c;SQLyog-13.1.6-0.x64是默认支持mysql8.0以上身份验证&#xff0c;把低版本的sqlyog升级到13.1.6就可以解决。 修改身份验证插件 首先…

国产台灯哪个品牌比较好?2023分享国内护眼灯排名

台灯已经是最常见的照明灯具&#xff0c;所以近些年受到许多青少年、家长的青睐&#xff0c;如果问国产台灯哪个牌子比较好&#xff1f;我会告诉你&#xff0c;在我使用的十几款护眼台灯中&#xff0c;比较优秀的是南卡护眼台灯Pro、明基MindDuo2 、雷士行星 、京东京造 星云台…

如何访问EMC VPLEX

本文介绍如何访问EMC的VPLEX虚拟化存储网关&#xff0c;下面的方法适用于VPLEX VS2系统&#xff0c;但也适用于VS6系统&#xff0c;只是VS6的管理控制台MMCS和VS2物理上不一样&#xff0c;但实质上是相同的&#xff0c;也都提供了一样的网络端口和IP地址。如果对VS6有问题&…

或许能用 ChatGPT 插件实现财富自由

文章目录或许能用 ChatGPT 插件实现财富自由1. 认识一下1.1 是什么1.2 怎么用2. 举个例2.1 Wolfram2.2 Browsing3. 怎么做到的4. 财富自由4.1 生活类插件4.2 品牌推广类5. 限制或许能用 ChatGPT 插件实现财富自由 我们知道&#xff0c;当前 ChatGPT 最大的局限性就是模型训…

【kubernetes-工具篇】K9S详解-宝藏k8s界面工具

K9S简介 K9s是一个命令行界面&#xff08;CLI&#xff09;工具&#xff0c;用于管理Kubernetes集群。它是一个流行的开源工具&#xff0c;可以帮助Kubernetes管理员和开发人员轻松管理他们的Kubernetes集群。在本文中&#xff0c;我们将简单介绍K9s的概念、功能和如何使用它。…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体&#xff0c;但程序、代码相对普通人而言&#xff0c;看着还是比较深奥难懂&#xff0c;但自从有了ChatGPT&#xff0c;不少对此有兴趣的外行人士&#xff0c;也能轻松写出代码了&#xff0c;比如让ChatGPT写一个贪吃蛇游戏&#xff0c;按它给出的…

Wallpaper:基于Typecho的壁纸头像站主题

简介&#xff1a; 该主题是本人的一个头像壁纸站点的主题&#xff0c;这个站最初是女朋友要让和她用情侣头像和壁纸&#xff0c;跑到网上转了一圈都没找到一个专门的情侣头像壁纸站&#xff0c;只在知乎某个答案下找到一些情侣头像&#xff0c;而情侣壁纸就更难找了&#xff0…

ChatGPT基础知识系列之一文说透ChatGPT

ChatGPT基础知识系列之一文说透ChatGPT OpenAI近期发布聊天机器人模型ChatGPT,迅速出圈全网。它以对话方式进行交互。以更贴近人的对话方式与使用者互动,可以回答问题、承认错误、挑战不正确的前提、拒绝不适当的请求。高质量的回答、上瘾式的交互体验,圈内外都纷纷惊呼。 …

html+css+JavaScript+json+servlet的社区系统(手把手教学)

目录 课前导读&#xff1a; 一、系统前期准备 二、前端代码的编写 三、登陆页面简介 四、注册页面 五、社区列表页 六、社区详情页 七、社区发帖页 八、注销 九、访问链接 登陆页面http://175.178.20.77:8080/java106_blog_system/login.html 总结&#xff1a; 课前…

【SQL】公网远程访问局域网SQL Server数据库【无公网IP内网穿透】

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 转发自CSDN远程穿透的文章&#xff1a;[无需公网IP&am…

Shader Graph8-输入Vector

一、三个向量 Vector叫做矢量或者向量&#xff0c;向量更偏向于数学&#xff0c;矢量更偏向于图形。下面三种Vector我们用的最多&#xff0c;红色叫Camera Vector相机向量、蓝色叫Surface Normal表面法线、黄色叫Light Vector光向量。 每个面都有法线&#xff0c;法线向量是这…

医院手术麻醉信息管理系统源码

医院手术麻醉信息管理系统源码 实现整个围术期术前、术中、术后的全数字化和信息化。 医院手术麻醉临床信息管理系统是一种基于云计算技术的信息系统&#xff0c;它可以帮助医院更好地管理手术麻醉临床信息&#xff0c;提高手术麻醉的安全性和效率。 首先&#xff0c;医院手术…

ASP.NET Core MVC 从入门到精通之接化发(一)

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

Adobe Photoshop 2023 的系统最低要求+安装图文教程

Adobe Photoshop 2023(PS2023) 来了,全世界数以百万计的设计师、摄影师和艺术家使用 Photoshop 将不可能变为可能。 从海报到包装&#xff0c;从基本的横幅到漂亮的网站&#xff0c;从令人难忘的徽标到引人注目的图标&#xff0c;Photoshop 让创意世界不断前进。 ​借助直观的…
最新文章