Linux调试器gdb的用法

Linux调试器gdb的用法

  • 1. debug/release版本之间的比较
  • 2. gdb调试器的基本指令
  • 3. 使用展示

1. debug/release版本之间的比较

在之前学习C语言的的时候出过一期vs的调试技巧。
而对于现在的Linux下的调试器gdb其实也是换汤不换药的,基本上的调试思路是不会改变的,改变的只是工具使用上。

  • Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。(可调试)
  • Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。(不可调试)。所以debug版本下是要存放一些调试信息的,侧面说了,debug版本下生成的可执行文件的体积是会更大的。
  • 这里要注意的是,我们Linux默认执行的是release版本的,如果要使其执行的是debug版本的话要加上选项-g

gcc -o 生成可执行文件 原文加 -g

在这里插入图片描述

  • 这里建议写在makefile文件中,直接make即可。
  • 如果还没有下载gdb调试工具的话执行以下指令:

sudo yum install -y gdb

2. gdb调试器的基本指令

指令功能
list或 l 行号展示所对应的行号的代码
b + 行号 / b + 函数名/ b 文件名称:行号给指定行号断点,对一个vs的快捷键F9
(delete breakpoints) d + 编号删除指定行号断点
info b 或 info break查看断点信息
run 或 r运行代码,对应vs的快捷键F5
disable + 断点编号禁用断点
enable + 断点编号开启断点
next或n逐过程调试代码,对应vs的快捷键F10
step或s逐语句调试代码,对应vs的快捷键F11
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p + 变量查看变量内容
display + 变量长显示变量内容,跟踪查看一个变量,每次停下来都显示它的值
undisplay + 编号删除长显示
continue或c从一个断点运行到下一个断点
breaktrace或bt调用堆栈。查看各级函数调用及参数
finish将一个函数运行结束后停止。执行到当前函数返回,然后挺下来等待命令
until + 行号在一定范围内,直到运行到指定行号运行停止
set var name=value修改变量name的内容为value
quit退出gdb

3. 使用展示

gdb 可执行文件
进入调试模式

在这里插入图片描述

  1. l 行号
    显示源代码,每次展示10行代码,但是gdb默认会记住上一次使用的指令,所以只需要一直按回车就可以直接执行并展示所有的代码。
    在这里插入图片描述
  2. (b 行号/b 函数名/b 文件名:行号)以及(info b)
    打断点相当于我们使用vs时的快捷键F9.
    1. b 行号打断点
    2. b 函数名打断点
    3. b 文件名:行号打断点
  • info b查看断点信息
    查看断点信息的时候,引入了断点编号的概念。也就是说gdb识别断点的方式并不是使用行号识别的,而是使用编号识别的,我们每设置一个断点信息,编号都会自增,只有当我们退出gdb调试后再次进入编号才会被刷新。
    而这个编号在我们删除编号,使能断点的时候都要用到。
    在这里插入图片描述
  1. d 断点编号
    d 断点编号 是删除断点信息的。断点编号需要用info b查看断点信息查看。
    在这里插入图片描述

  2. run或r运行代码
    如果有断点,则会运行到断点处停止运行。
    在这里插入图片描述

  3. disable/enable打开/关闭断点
    有的时候我们设置了断点,但是为了测试另一部分代码,可能要删除当前的断点,但是当前的断点可能下次也是需要用到的,于是就可以将断点暂时关闭使用disable,要用到的时候打开断点enable
    在这里插入图片描述
    在这里插入图片描述

  4. next或n逐过程编译/step或s逐语句编译
    n逐过程编译相当于vs的快捷键F10,进行逐条语句编译。
    s逐语句编译相当于vs的快捷键F11,进行逐过程编译。
    在这里插入图片描述

  5. p 变量名——查看变量内容
    用于显示变量的内容,但是缺点是只能显示一次,如果还想再看,只能重新输入指令。
    在这里插入图片描述

  6. display 变量/undispaly 变量
    display——可以长时间显示变量的值,可以进行时事更新变量的值
    undisplay——删除长显示变量
    在这里插入图片描述

  7. continue或n
    跳转断点。运行两个端点之间的代码,会从一个断点运行到另一个断点后停止。
    在这里插入图片描述

  8. bt
    调用堆栈。
    在这里插入图片描述

  9. finish
    finish——将一个函数运行完后停止。
    有时候我们debug代码的时候,确定了就是在这几个函数中的其中一个函数出错了,这个时候我们就要对函数一一排查,把每一个函数到debug以下。
    在这里插入图片描述

  10. until 行号
    until在一个范围内指定运行到指定的行号。
    在这里插入图片描述

  11. set var name=value
    我们都知道,一个已经运行起来的代码中的变量不能不能别修改了。但是gdb中可以在调试的时候修改这个变量的值。
    在这里插入图片描述
    我在函数部分加上了一个判断结构,正常情况下都是会执行printf(sum)这个函数的。
    在这里插入图片描述
    但是我们可以让它输出haha
    在这里插入图片描述
    这个功能用于我们debug的时候,用来判断语句,但是不知道是哪一部份出错了,就要手动去修改值,让调试的时候进入指定的判断里面去debug,但是有了这个指令就不需要了。
    注:这个修改不是本质上的修改,只是名义上的修改,一旦退出被修改的值会恢复原来的值。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http -- 跨域问题详解(浏览器)

参考链接 参考链接 1. 跨域报错示例 Access to XMLHttpRequest at http://127.0.0.1:3000/ from origin http://localhost:3000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header…

【Java 集合】LinkedBlockingDeque

在开始介绍 LinkedBlockingDeque 之前, 我们先看一下 LinkedBlockingDeque 的类图: 从其中可以看出他直接实现了 BlockingDeque 接口, 而 BlockingDeque 又实现了 BlockingQueue 的接口, 所以它本身具备了队列的特性。 而实现 BlockingDeque 使其在 BlockingQueue 的基础上多了…

Spring Boot自动装配原理以及实践

了解自动装配两个核心 Import注解的作用 Import说Spring框架经常会看到的注解,它有以下几个作用: 导入Configuration类下所有的bean方法中创建的bean。导入import指定的bean,例如Import(AService.class),就会生成AService的bean&#xff0…

获取请求体中json数据并解析到实体对象

目录 相关依赖 前端代码 后端代码 测试结果 相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency> <dependency><groupId>comm…

02 ModBus TCP

目录 一、ModBus TCP 一帧数据格式 二、0x01 读线圈状态 三、0x03读保持寄存器 四、0x05写单个线圈 五、0x06 写单个寄存器 六、0x0f写多个线圈 七、0x10&#xff1a;写多个保持寄存器 八、通信过程 九、不同modbus通信模式的应用场景 一、ModBus TCP 一帧数据格式 其…

fill-in-the-middle(FIM) 实现与简单应用

1 背景 传统训练的 GPT 模型只能根据前文内容预测后文内容&#xff0c;但有些应用比如代码生成器&#xff0c;需要我们给出上文和下文&#xff0c;使模型可以预测中间的内容&#xff0c;传统训练的 GPT 就不能完成这类任务。 传统训练的 GPT 只能根据上文预测下文 使用 FIM…

基于Pytest+Requests+Allure实现接口自动化测试

一、整体结构 框架组成&#xff1a;pytestrequestsallure 设计模式&#xff1a; 关键字驱动 项目结构&#xff1a; 工具层&#xff1a;api_keyword/ 参数层&#xff1a;params/ 用例层&#xff1a;case/ 数据驱动&#xff1a;data_driver/ 数据层&#xff1a;data/ 逻…

玩转大数据19:数据治理与元数据管理策略

随着大数据时代的到来&#xff0c;数据已经成为企业的重要资产。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;成为了一个亟待解决的问题。数据治理和元数据管理是解决这个问题的关键。 1.数据治理的概念和重要性 数据治理是指对数据进行全面、系统、规范的管理…

MLOps在极狐GitLab 的现状和前瞻

什么是 MLOps 首先我们可以这么定义机器学习&#xff08;Machine Learning&#xff09;&#xff1a;通过一组工具和算法&#xff0c;从给定数据集中提取信息以进行具有一定程度不确定性的预测&#xff0c;借助于这些预测增强用户体验或推动内部决策。 同一般的软件研发流程比…

行为型设计模式(一)模版方法模式 迭代器模式

模板方法模式 Template 1、什么是模版方法模式 模版方法模式定义了一个算法的骨架&#xff0c;它将其中一些步骤的实现推迟到子类里面&#xff0c;使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。 2、为什么使用模版方法模式 封装不变部分&#xff1a;模版…

vscode配置node.js调试环境

node.js基于VSCode的开发环境的搭建非常简单。 说明&#xff1a;本文的前置条件是已安装好node.js(具体安装不再赘述&#xff0c;如有需要可评论区留言)。 阅读本文可掌握&#xff1a; 方便地进行js单步调试&#xff1b;方便地查看内置的对象或属性&#xff1b; 安装插件 C…

RouterSrv-DHCP

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装和配置DHCP relay服务,为办公区域网络提供地址上网。DHCP服务器位于AppSrv服务器上。拆分DHCP服务器上的作用域,拆分的百分比为7:3。InsideCli优先从RouterSrv获取地址。配置步骤 安装和配置DHCP relay服务,为办…

AIGC:阿里开源大模型通义千问部署与实战

1 引言 通义千问-7B&#xff08;Qwen-7B&#xff09;是阿里云研发的通义千问大模型系列的70亿参数规模的模型。Qwen-7B是基于Transformer的大语言模型, 在超大规模的预训练数据上进行训练得到。预训练数据类型多样&#xff0c;覆盖广泛&#xff0c;包括大量网络文本、专业书籍…

云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践

导语 由 InfoQ 主办的 Qcon 全球软件开发者大会北京站上周已精彩落幕&#xff0c;腾讯云中间件团队的冉小龙参与了《云原生机构设计与音视频技术应用》专题&#xff0c;带来了以《云原生消息流系统 Apache Pulsar 在腾讯云的大规模生产实践》为主题的精彩演讲&#xff0c;在本…

Linux shell编程学习笔记37:readarray命令和mapfile命令

目录 0 前言1 readarray命令的格式和功能 1.1 命令格式1.2 命令功能1.3 注意事项2 命令应用实例 2.1 从标准输入读取数据时不指定数组名&#xff0c;则数据会保存到MAPFILE数组中2.2 从标准输入读取数据并存储到指定的数组2.3 使用 -O 选项指定起始下标2.4 用-n指定有效行数…

21.Servlet 技术

JavaWeb应用的概念 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义&#xff1a;“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行。” Java Web应用中可以包含如下…

人工智能的发展之路:时间节点、问题与解决办法的全景解析

导言 人工智能的发展历程充满了里程碑式的事件&#xff0c;从早期的概念到今天的广泛应用&#xff0c;每个时间节点都伴随着独特的挑战和创新。本文将详细描述每个关键时间节点的事件&#xff0c;探讨存在的问题、解决办法&#xff0c;以及不同阶段之间的联系。 1. 195…

重温经典struts1之自定义转换器及注册的两种方式(Servlet,PlugIn)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 Struts的ActionServlet接收用户在浏览器发送的请求&#xff0c;并将用户输入的数据&#xff0c;按照FormBean中定义的数据类型&#xff0c;赋值给FormBean中每个变量&a…

Databend 源码阅读: Meta-service 数据结构

作者&#xff1a;张炎泼&#xff08;XP&#xff09; Databend Labs 成员&#xff0c;Databend 分布式研发负责人 drmingdrmer (张炎泼) GitHub 引言 Databend 是一款开源的云原生数据库&#xff0c;采用 Rust 语言开发&#xff0c;专为云原生数据仓库的需求而设计。 面向云架…

利用prometheus+grafana进行Linux主机监控

文章目录 一.架构说明与资源准备二.部署prometheus1.上传软件包2.解压软件包并移动到指定位置3.修改配置文件4.编写启动脚本5.启动prometheus服务 三.部署node-exporter1.上传和解压软件包2.设置systemctl启动3.启动服务 四.部署grafana1.安装和启动grafana2.设置prometheus数据…