【Linux】gdb-调试代码的工具

news2024/11/19 2:45:06

目录

一、概述

1.1 gdb是什么

1.2 为什么要使用gdb

二、gdb的简单使用

2.1 安装gdb

2.2 软件的debug版本和release版本

2.3 使用gdb


在之前的学习中,我们已经能够用vim编写和gcc/g++编译代码了,下面来学习如何调试代码。

一、概述

1.1 gdb是什么

在Linux系统中,GDB(GNU Debugger)是一个强大的、灵活的、开源的调试工具,用于对程序进行调试。它允许开发人员在程序崩溃或者运行出错时检查程序的内部状态,跟踪代码的执行过程,并尝试找出程序中的错误。

gdb是 GDB 命令行工具的缩写形式,可以在终端中使用该命令启动 GDB 调试器。

1.2 为什么要使用gdb

我们在编写代码时总会有各种各样的错误,这些错误基本可以分为两类:

  1. 语法错误:编译器会报错,解决比较方便
  2. 逻辑错误:此时就需要调试代码

虽然我们有各种各样的IDE,但是对于从事 Linux C/C++ 开发的程序员来说,大多数都需要熟悉gdb调试工具。尤其当不具备IDE的环境时(嵌入式系统等资源限制的场景),gdb以其占用资源少、开源免费和方便实用的优势被广泛使用。

二、gdb的简单使用

在Linux下调试代码分为两步:

  1. 调试代码的思路。
  2. 调试代码的工具。

确定问题、分析缩小范围、找到问题所在、提出解决方案。这种调试代码的思路都是一样的,所以调试代码侧重点在于把调试思路用在gdb这个调试工具上

2.1 安装gdb

  1. 打开终端并输入以下命令来安装gdb:
    sudo yum install -y gdb
  2. 安装完成后,您可以使用以下命令来验证gdb是否成功安装:
    gdb --version

2.2 软件的debug版本和release版本

程序的发布方式有两种,debug模式和release模式,debug模式可以被调试,release版本用于测试和发布。
原因:测试人员要测试的代码,必须是用户最终用的,debug版本有很多调试信息,这些信息用户不需要而且也会使软件资源占用较大。release版本的代码都是用户需要的。

使用 gdb <可执行程序名>  即可进入调试模式,

但要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,否则报错。

Linux gcc/g++出来的二进制程序,默认是release模式。 
证明:1.在debug发布的时候,一定要给可执行程序内部添加debug信息,否则无法调试!
           2.release文件更小

我们在Linux中形成的可执行程序格式:ELF格式  ,包含很多可执行程序的信息,如代码开始和结束的位置,用以下命令读取。

readelf -S <可执行程序名> -g | grep -i debug

-S 读取二进制文件构成, -i 忽略大小写

执行readelf -S <可执行程序名> -r | grep -i debug  不会显示信息,因为没有release版本没有调试信息。

结论:如果你想让你的程序被调试,必须加 -g 以debug方式发布!

2.3 使用gdb

使用 gdb <可执行程序名>  即可进入调试模式,q 退出

 常用的 gdb 命令:

  • list(l) 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list(l) 函数名:列出某个函数的源代码。
  • run(r):运行程序。
    类似vs的F5,没有断点是直接运行。
  • next(n):单条执行。
    类似Vs的F10
  • step(s):进入函数调用
    类似Vs的F11
  • break(b) 行号:在某一行设置断点
    b 18 给当前文件18行打断点
    b mycode.c:20    在mycode.c的第20行打断点
  • break(b)  函数名:在某个函数开头设置断点                     
    b main    在main函数的入口处打断点
    b mycode.c:ADD   在mycode.c的ADD函数的入口处打断点
  • info(i) break(b) :查看断点信息。

    Enb:使能,即断点有没有开启/生效
  • finish:执行到当前函数返回,然后挺下来等待命令
    运行一个函数至函数完成
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
    print(x+1) 将输出 x+1 表达式的计算结果。
  • p 变量:打印变量值。
    p x 将输出变量 x 当前的值
  • set var:修改变量的值
    不是一直执行到变量为该值,而是直接修改变量,最终结果可能不符合期望,例如累加。
    常用于条件判断
  • continue(或c):从当前位置开始连续而非单步执行程序
    从一个断点运行到下一个断点处
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
    断点存在,但是不起作用
  • enable breakpoints:启用断点
    与 disable 相反,该命令将启用当前所有被禁用的断点,使它们重新生效。
  • display 变量名(或变量的地址):跟踪查看一个变量,每次停下来都显示它的值
    长显示一个变量,并带上编号,从下往上递增
  • undisplay n:取消对先前设置的序号为n的变量的跟踪
    取消长显示,序号递增不会重复
  • until X行号:跳至X行
    如果目的行不是有效代码( '{' '}' 或空格 ),将会跳到下一个有效代码的位置。
    不用打断点就可以跳到指定行,常用于循环。
  • breaktrace(或bt):查看各级函数调用及参数
    查看调用堆栈
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

注:

  1. list可简写成 l ,break 可简写成 b ,print 可简写成(p),continue 可简写成 c ,
    run可简写成 r ,info 可简写成 i ,quit 可简写成 q
  2. gdb会记录最近执行的命令,按回车键可执行上一次的命令。
    例如输入 l 后,按回车键直接继续向下展开代码,直至结束,不用再输入“l 行号”。
  3. gdb文件可以根据文件的行号、文件名打断点,但是删除断点时不能使用行号或函数名,只能根据断点编号删除(使用info b查看)
  4. 在一个调试周期中,断点的编号是一直递增的,一个编号只会出现一次,退出gdb模式时,所有的断点信息被清空

以上所讲都是常用命令,希望大家能够熟练使用,也希望大家能在网上搜索和学习gdb的其他使用方法。

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

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

相关文章

扩展学习|商业智能和分析:从大数据到大影响

文献来源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下载链接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取码&#xff1a;a8uy 在不同的组…

【USRP】LFTX / LFRX

LFTX/LFRX 设备概述 LFTX 子板利用两个高速运算放大器来允许 0-30 MHz 的传输。该板仅接受实模式信号。LFTX 非常适合 HF 频段的应用&#xff0c;或使用外部前端来上变频和放大中间信号的应用。LFTX 的输出可以独立处理&#xff0c;也可以作为单个 I/Q 对进行处理。 主要特征…

基于SpringBoot+Vue会员制医疗预约服务管理信息系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

vue零基础

vue 与其他框架的对比 框架设计模式数据绑定灵活度文件模式复杂性学习曲线生态VueMVVM双向灵活单文件小缓完善ReactMVC单向较灵活all in js大陡丰富AngularMVC双向固定多文件较大较陡&#xff08;Typescript&#xff09;独立 更多对比细节&#xff1a;vue 官网&#xff1a;ht…

【人工智能 | 知识表示方法】状态空间法 语义网络,良好的知识表示是解题的关键!(笔记总结系列)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

漏洞复现--速达进存销管理系统任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

区块链扩容问题研究【06】

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

这章是接上一章&#xff0c;使用RPC包&#xff0c;序列化中没有详细去讲&#xff0c;因为这一块需要看的和学习的地方很多。并且这一块是RPC中可以说是最重要的一块&#xff0c;也是性能的重要影响因子。今天这篇主要会讲其使用方式。 文章目录 Protocol Buffers V3 背景以及概…

编译 Flink代码

构建环境 JDK1.8以上和Maven 3.3.x可以构建Flink&#xff0c;但是不能正确地遮盖某些依赖项。Maven 3.2.5会正确创建库。所以这里使用为了减少问题选择 Maven3.2.5版本进行构建。要构建单元测试&#xff0c;请使用Java 8以上&#xff0c;以防止使用PowerMock运行器的单元测试失…

SpringBoot集成系列--RabbitMQ

文章目录 一、代码1、添加依赖2、配置RabbitMQ连接3、RabbitMQ配置4、创建生产者5、创建消费者6、测试 二、遇到的问题1、Channel shutdown2、收不到信息3、安装RabbitMQ&#xff0c;无法访问控制台访问 一、代码 1、添加依赖 在pom.xml文件中添加RabbitMQ的相关依赖 <de…

10天玩转Python第2天:python判断语句基础示例全面详解与代码练习

目录 1.课程之前1.1 复习和反馈1.2 作业1.3 今日内容1.4 字符串格式化的补充1.5 运算符1.5.1 逻辑运算符1.5.2 赋值运算符1.5.3 运算符优先 2.判断2.1 if 的基本结构2.1.1 基本语法2.1.2 代码案例2.1.3 练习 2.2 if else 结构2.2.1 基本语法2.2.2 代码案例2.2.3 练习 2.3 if 和…

基于JavaWeb+SpringBoot+Vue在线拍卖系统的设计和实现

基于JavaWebSpringBootVue在线拍卖系统系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 …

「实用教程」win32spl.dll文件的作用及修复方法分享

本文将为您详细介绍Win32spl.dll文件的作用、丢失原因以及提供5个修复教程&#xff0c;帮助您解决这一问题。 一、Win32spl.dll文件的作用 Win32spl.dll是一个动态链接库文件&#xff0c;它是Windows操作系统中的一个重要组件。该文件主要负责处理系统启动时的一些操作&#…

[笔记] 使用 qemu/grub 模拟系统启动(单分区)

背景 最近在学习操作系统&#xff0c;需要从零开始搭建系统&#xff0c;由于教程中给的虚拟机搭建的方式感觉还是过于重量级&#xff0c;因此研究了一下通过 qemu 模拟器&#xff0c;配合 grub 完成启动系统的搭建。 qemu 介绍 qemu 是一款十分优秀的系统模拟器&#xff0c;…

[MySQL]SQL优化之索引的使用规则

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引失效 &#x1f4d5;最左前缀法则 &#x1f4d5;范围查询> &#x1f4d5;索引列运算&#xff0c;索引失效 &#x1f4d5;前模糊匹配 &#x1f4d5;or连接的条件 &#x1f4d5;字符串类型不加 …

《PySpark大数据分析实战》-03.了解Hive

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

Redis基础系列-主从复制

Redis基础系列-主从复制 文章目录 Redis基础系列-主从复制1. 什么是 Redis 主从复制&#xff1f;2. 主从复制有什么好处&#xff1f;3. 如何配置 Redis 主从复制&#xff1f;4. 主从复制的验证4.1 如何查看主从搭建成功4.2 主从常见疑问4.3 主从常见命令 5. 主从复制的原理和工…

node14升级node16之后,webpack3项目无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 版本改了好多个的&#xff0c;但是不确定具体是哪几个起作用的&#xff0c;…

c++ map

unordered_map #include <iostream> #include <string> #include <unordered_map>int main() {// 创建包含三个字符串的&#xff08;映射到字符串的&#xff09;unordered_mapstd::unordered_map<std::string, std::string> u {{"red", &qu…

计算机丢失msvcp140dll怎么恢复?快速解决dll缺失问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140dll丢失”。msvcp140.dll是一个动态链接库文件&#xff0c;它包含了许多C标准库函数的实现。这些动态链接库文件是程序运行所必需的&#xff0c;它们包含了许多函数和资源&#xf…