在 VSCode 中使用 GDB 进行 C/C++ 程序调试(图文版)

news2024/9/21 20:53:43
  • (꒪ꇴ꒪ ),Hello我是祐言QAQ
  • 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍
  • 快上🚘,一起学习,让我们成为一个强大的攻城狮!
  • 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,请在评论区指正,感谢🙏

引言

        在软件开发过程中,调试是不可或缺的一部分。C/C++ 开发者常常使用 GDB 进行调试,而在 Visual Studio Code中集成 GDB 可以提供一种高效、直观的调试体验。本文将为你详细介绍如何在 VS Code 中配置和使用 GDB 进行 C/C++ 调试,并解答一些常见问题。

一. 安装 VSCode 插件

        首先,确保你已经在 VSCode 中安装了 C/C++ 和 GDB Debug插件,如果没有安装,可以在 Extensions 视图(左侧四个方块)中搜索 "C/C++" 和“GDB Debug” 并分别进行安装(Install),该插件提供了强大的代码编辑和调试功能。

二. 配置 GDB

        在配置 GDB 之前,确保你已经安装了 GDB 调试器。然后,在 VSCode 中创建一个 launch.json 文件以配置调试环境。或者直接点击运行调试就会弹出配置该文件的提示。

        打开后默认长这样,当然是不行的,所以点击右下角的Add Configuration...

        然后选择你需要的类型:

   或者复制如下代码直接粘贴进去亦可:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/your_executable", //${workspaceFolder}是路径除执行文件外其他
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}", //这里也一样
            "environment": [],        //环境有则需要配置,无则无需管
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "build"
        }
    ]
}

        但要确保替换 "your_executable" 为你的可执行文件的路径。这个配置会告诉 VSCode 使用 GDB 进行调试。

三. 基本调试命令

在 VSCode 的调试视图中

        你可以使用一系列基本调试命令,如:

  • Breakpoints(break): 在源代码中设置断点,以便在程序执行到这些地方时停下来;
  • Run(F5): 启动程序;
  • Continue(continue): 恢复程序执行,直到下一个断点;
  • Step Into(F11): 逐行进入函数内部;
  • Step Over(F10): 逐行执行当前函数,不进入函数内部;
  • Step Out(Shift+F11) : 从当前函数中跳出,继续执行到函数返回的地方;
  • Stop(Shift+F5): 停1止调试;

终端使用命令行方式调试

        启动GDB的方式一般为: gdb <你的可执行文件名>,还有如下的几种:

1.调试core文件:
//用于调试一个运行程序和core文件,core文件是程序非法执行后core dump产生的文件
gdb <program> core  

2.使用GDB “attach”到一个正在运行的服务程序上去,并调试它:
gdb <program> <PID>
或者:
gdb attach <PID>

        主要的步骤详细说明一下,其他的自己摸索一下就会了,具体步骤如下:

1.运行(毫无设置的run)

2. 设置断点(在运行之前设置)

        设置断点是调试的关键步骤之一。在源代码中点击行号旁边,或者通过命令行使用 break 命令设置断点(第十行),还可以在指定模块和函数前设置断点,禁用断点和删除断点等。

3. 逐行运行

        这里主要说一下step和next的区别:

  • step 命令: 逐行执行程序,进入函数内部;

  • next 命令: 逐过程执行程序,不进入函数内部。

4.backtrace 使用

        在GDB调试中,有时候会出现报错Segmentation fault,该报错是因为出现了内存错误,我们就可使用 backtrace 命令来追溯问题出在哪一步,当然这个问题一般出现时就会提示错误在哪一行,但我们可以通过该命令来回溯其之前调用的地方逐个检查问题,方便更快找出。

5. 常见错误解决        

       一般来说,配置好之后点击“运行和调试”,右上角就会出现该绿色三角,点击之后报错让你修改 launch.json 文件 那么说明你的该文件中存在语法上的错误或缺失某行,照着检查一下即可,一定要注意路径的/是否加全。

        在 VSCode 中,GDB 的集成提供了直观的调试工具。你可以查看变量、观察寄存器状态等。通过调试视图,你可以更轻松地导航和掌握程序执行的每个步骤。

        除了基本的调试命令外,GDB 还提供了一些高级技巧,如查看内存、观察程序状态等。深入了解这些功能可以帮助你更全面地调试代码。一般来说两种GDB使用方式配合调试是最好的,它们在不同的地方有各自的亮点和作用。

四、结语        

        通过本文的指南,希望将能够在 VSCode 中配置和使用 GDB 进行 C/C++ 程序的高效调试。调试是编程中的一项重要技能,善用调试工具可以提高代码质量,加速开发周期。

        更多C/C++语言Linux系统数据结构ARM板实战相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            系统、网络编程

                                     探索C++

                                             6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉🎉🎉感谢关注🎉🎉🎉

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

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

相关文章

steam游戏找不到steam_api64.dll,分享三个有效的解决方法

在现代科技发展的时代&#xff0c;游戏已经成为了许多人生活中不可或缺的一部分。而Steam作为全球最大的数字发行平台之一&#xff0c;拥有着庞大的游戏库和活跃的用户群体。然而&#xff0c;在使用Steam时&#xff0c;有些用户可能会遇到Steam_api64.dll丢失的问题&#xff0c…

一般人用 Linux 算是找虐吗?

一般人用 Linux 算是找虐吗&#xff1f; 主要得看用什么Linux&#xff0c;毕竟Android也算是Linux&#xff0c;满大街一般人整天在用&#xff0c;也没什么人觉得自己在找虐。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资料&#xff0c;然后我根据自己从业十年经验&…

实现点击一个选框 使得一个组件的可选性修改

实现效果 代码 html <div class"divrow"><el-checkbox-group v-model"isSendTag" :max"1"><el-checkbox v-for"(item, index) in isSendTagOptions" :key"index" :label"item.value">{{item.…

实时数据备份实践inotify和rsync联动

目录 一、实时数据备份 1.实时数据备份 2.定时任务周期性的数据备份 3.实时数据备份 4.Inotify机制 二、实践 1.实时复制环境准备 2.实时复制概念 3.InofityRsync实施复制实战 4.配置好rsync守护进程 5.检查linux是否支持inotify 6.安装inotyify--tools 7.inotify…

黑马React: Redux

黑马React: Redux Date: November 19, 2023 Sum: Redux基础、Redux工具、调试、美团案例 Redux介绍 Redux 是React最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行 作用&#xff1a;通过集中管理的方式管…

nodejs搭建本地服务

前端开发时想自己有个本地服务如下操作直接上干货 1.在桌面上直接在powerShell 输入命令行 npm install -g express-generator 然后 npm install -g express 然后新建一个例如server的文件夹 在powerShell执行 express myStudy -e 端口号默认是3000 直接在地址栏输入 http://…

京东数据分析平台(京东运营数据采集):2023年10月京东白酒品牌销售排行榜

鲸参谋监测的京东平台10月份白酒市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;10月份&#xff0c;京东平台上白酒的销量为340万&#xff0c;环比增长约16%&#xff0c;同比增长约37%&#xff1b;销售额为28亿&#xff0c;环比增长约20%&#xff0c;同比增长约122…

【STM32外设系列】JW01三合一空气质量检测模块

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、JW01模块简介二、数据格式介绍三、程序设计3.1 串口初始化3.2 串口接收中断服务函数3.3 数据解析函数 四、其他…

全面的日志监控管理工具

企业网络由众多日志源组成。集中监控这些日志源有助于防止数据威胁和网络攻击&#xff0c;综合日志监控解决方案可以自动执行日志管理流程&#xff0c;通过关联日志来识别恶意活动&#xff0c;并帮助满足IT合规性要求。 不同类型的日志监控 EventLog Analyzer 综合日志监控解…

Mysql数据库 17.Mysql存储引擎

Mysql体系结构分为4层&#xff1a; 1.连接层 最上层是一些客户端和连接服务&#xff0c;包括大多数基于客户端/服务端工具实现的类似于TCP/IP的通信&#xff0c;主要功能是完成一些类似于连接处理、授权认证、安全方案等&#xff0c;在该层上还引入线程池的概念&#xff0c;为…

免费图书教材配套资料:Spark大数据技术与应用(第2版)

《Spark大数据技术与应用&#xff08;第2版&#xff09;》课程内容全面介绍了Spark大数据技术的相关知识&#xff0c;内容包含包括Spark概述、Scala基础、Spark编程、Spark编程进阶、Spark SQL结构化数据文件处理、Spark Streaming实时计算框架、Spark GraphX图计算框架、Spark…

电商平台API接口的作用到底是什么?重要性又是什么?具体接入方式?

电商平台API接口的重要性及其作用主要体现在以下几个方面&#xff1a; 数据支持&#xff1a;电商平台拥有大量的商品信息、用户信息、交易信息等大数据资产&#xff0c;而API接口提供访问这些数据的途径&#xff0c;使得其他软件、应用、网站等可以利用这些数据提供更丰富的功…

priority_queue简单实现(优先级队列)(c++)

priority_queue priority_queue介绍逻辑实现框架调整算法adjust_up()adjust_down() 仿函数/比较函数仿函数特性 构造函数迭代器区间构造 完整优先级队列代码 priority_queue介绍 pri_que是一个容器适配器&#xff0c;它的底层是其他容器&#xff0c;并由这些容器再封装而来。类…

PCB抄板的一些方法

PCB抄板的技术实现过程简单来说&#xff0c;就是先将要抄板的电路板进行扫描&#xff0c;记录详细的元器件位置&#xff0c;然后将元器件拆下来做成物料清单&#xff08;BOM&#xff09;并安排物料采购&#xff0c;空板则扫描成图片经抄板软件处理还原成pcb板图文件&#xff0c…

实例讲解Simulink的MATLAB Function模块

内容 MATLAB Function是一个支持使用M语言编写模块功能,并能够将所编写的M语言生成C代码&#xff0c;用于开发桌面应用和嵌入式应用的模块。它支持的 MATLAB内建函数比 Fcn模块要广泛&#xff0c;除去基本的四则运算、逻辑操作符和关系操作符&#xff0c;还可以调用MATLAB各种…

动能方案 | 15693协议的读卡器应用 DP1363F 替代RC663

15693协议是一种高频&#xff08;13.56 MHz&#xff09;射频识别&#xff08;RFID&#xff09;协议&#xff0c;广泛满足无线识别和数据传输领域。其特点包括较远的读取范围、支持快速数据传输、与多个标签的兼容等&#xff0c;产生于不同行业有着广泛的应用&#xff0c;包括但…

实时云渲染与本地渲染:优劣对比与未来趋势

随着科技的迅速发展&#xff0c;图形渲染技术也随之演进&#xff0c;而实时云渲染作为新兴的渲染方式&#xff0c;正在逐渐改变我们对图形处理的看法。相较于传统的本地渲染&#xff0c;实时云渲染在便捷性、成本、协同能力、物理稳定性等多个方面都表现出独特的优势&#xff0…

【考研】数据结构(更新到双链表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…

云原生正在重塑软件的整个生命周期(内附资料)

随着企业数字化转型进程的发展&#xff0c;企业面临着新旧商业形态的剧变&#xff0c;颠覆和重构时刻都在发生。 企业需要更加快速地感知用户侧的需求变化并做出调整&#xff0c;才有可能在竞争中持续积累优势。业务的个性化、敏捷化、智能化需求日益突显&#xff0c;数字化应…

新的按人口比例的邮政编码

上次写信是什么时候&#xff1f;已经多久没用过邮政编码了&#xff1f;随着科技的进步&#xff0c;现在的人们似乎已经不再写信了&#xff0c;取而代之的是电子邮件、微信等。而且&#xff0c;手写字体识别功能&#xff0c;做为人工智能的入门级应用&#xff0c;也已经很成熟了…