【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3(GDB调试器的基础使用)

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3(GDB调试器的基础使用)

目录

  • 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用3(GDB调试器的基础使用)
      • 背景
      • gdb的一些指令
      • gdb实际运用
          • 显示代码
          • 运行程序、打断点、查看调试信息

作者:爱写代码的刚子
时间:2023.7.18
前言:本篇博客主要讲解Linux中调试器的使用,为之后的Linux编程打下坚固的基础。

背景

  • 程序的发布方式有两种,debug模式(能被调试 )和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项特别注意

gdb的一些指令

开始调试:

  • gdb binFile (gdb + 可执行程序)

退出调试:

  • ctrl + d或quit

调试命令:

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。 list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

gdb实际运用

gcc默认编译是 release方式发布的,无法直接调试
如果要以debug方式发布,编译时必须携带-g选项(检查makefile文件里面是否携带了-g选项)

  • 下载gdb

  • 查看文件是否有调试信息

  • readelf -S 可执行文件读取可执行程序的二进制构成(有各种的数据段)
    在这里插入图片描述

  • readelf -S 可执行文件 | grep -i debug查看文件是否具有调试信息
    在这里插入图片描述

  • 先用vim写一行测试代码:
    在这里插入图片描述

  • g++ -g 文件名将程序以debug方式编译
    在这里插入图片描述

  • gdb 可执行文件名对该可执行文件进行调试
    在这里插入图片描述

显示代码
  • list + 数字/l + 数字显示代码内容,继续l或者直接回车(gdb会记录上一条指令)显示后面的代码
    在这里插入图片描述
  • l + 函数名显示该函数所在的代码
    在这里插入图片描述
运行程序、打断点、查看调试信息
  • r 运行程序
    在这里插入图片描述
  • break + 行号 / b + 行号在某一行打上断点
    在这里插入图片描述
  • info break / info b显示断点信息
  • d + 断点编号删除某一断点(注意不是断点加行号)
    在这里插入图片描述
    ==注意退出gdb之后断点信息会消失 ==
    在这里插入图片描述
  • 打断点并运行
    在这里插入图片描述
  • n / next逐行运行(gdb会跳过空行)不会进入函数

    当需要连续按n时可以使用回车键来代替。(gdb会记录之前行为)
  • step / s逐语句运行(会进入函数内部)
    在这里插入图片描述
  • p +变量名查看变量对应的信息
    在这里插入图片描述
  • display +变量名将变量信息设为常显示
    在这里插入图片描述
    每次使用n(next)或者s(step)会显示常显示信息
  • undisplay + 常显示变量的编号取消对该变量的常显示
    在这里插入图片描述
    同理退出gdb之后调试信息就会消失
  • until +行数在一个函数内跳转至指定的行数(可以用于跳出函数内部的循环)
    在这里插入图片描述
    在这里插入图片描述
    特别注意,当调试到含有cout行的代码时,要用n进入下一行,不能用s,s是要调试进入到C++的源码部分,也就是cout,这个没有所以s进不去,除非把C++的标准库也变为debug版本才能调试(这是作者遇到的问题)
  • finish直接将函数运行完停下来
    在这里插入图片描述
  • continue / c从一个断点直接运行到下一个断点
    在这里插入图片描述
  • disable +断点编号关闭对应的断点
    在这里插入图片描述
    这里将二号断点关闭了
  • enable +断点编号将断点打开在这里插入图片描述

附:

  • b +函数名将断点打在函数入口的第一条语句
  • b +文件名:行号将断点打在该文件的某行
  • b +文件名:函数名将断点打在该文件对应函数入口的第一条语句处
  • set var 修改变量的值修改变量的值
    在这里插入图片描述
    (在循环中修改变量的值)
  • ** breaktrace / bt**查看函数调用轨迹(函数调用链)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • info local / i locals查看该函数内部的本地变量
    在这里插入图片描述

gdb的基础操作完结

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

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

相关文章

【NLP】transformers的位置编码

一、背景 本文是“实现的变压器”系列的第二篇。它从头开始引入位置编码。然后,它

Day4 网络流与二分图

之前那篇博客是在入门网络流时写的&#xff0c;现在对网络流重新有了一定的理解。 1. 最大流 FF 增广思想 Ford–Fulkerson 增广&#xff0c;核心即不断找增广路并增广。 dfs 实现 // FF brute #include <bits/stdc.h> #define int long longusing namespace std;in…

OkHttp原理和机制讲解

OkHttp原理和机制讲解 本文链接&#xff1a;https://blog.csdn.net/feather_wch/article/details/131767285 1、OkHttp的原理和机制包括哪些部分&#xff1f; 设计模式的运用&#xff1a;建造者模式、外观模式、责任链模式整体流程分发器(调度机制)TCP链接复用(复用机制)拦截…

2023米哈游图像算法暑期实习面经

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 本文不可转载 违者必究 1.自我介绍 2.能实习多久&#xff1f;公司在心目中的地位排序等 3.是否了解公司&#xff0c;用他们的产品吗&#xff1f;(比如原神) &#xff0c;喜欢游戏吗&#xff1f; 我只知道公司…

划片机的作用将晶圆分割成独立的芯片

划片机是将晶圆分割成独立芯片的关键设备之一。在半导体制造过程中&#xff0c;晶圆划片机用于将整个晶圆切割成单个的芯片&#xff0c;这个过程被称为“晶圆分割”或“晶圆切割”。 晶圆划片机通常采用精密的机械传动系统、高精度的切割刀具和先进的控制系统&#xff0c;以确保…

web-其他注入

堆叠注入 mysqli_query()只能执行一条SQL语句&#xff0c;mysqli_multi_query()可以执行多条语句 堆叠注入与联合查询的区别&#xff1a;union 执行的语句类型是有限的&#xff0c;只能执行 select &#xff0c;堆叠注入可以执行任意语句。但使用堆叠注入&#xff0c;需要后端…

恢复idea删除的git本地文件

idea中删除git本地文件无法远程拉取pull已删除文件的问题 当前本地库处于另一个分支中&#xff0c;需将本分支Head重置&#xff0c;git 强行pull并覆盖本地文件 解决方式一&#xff1a; git fetch --all git reset --hard origin/master git pull解决方式二&#xff1a; git…

Oracle密码文件

Oracle密码文件 Oracle密码文件用于用户远程管理数据库验证 我们可以通过将普通用户加入到密码文件中&#xff0c;使他们可以使用sysdba或sysoper的权限来管理数据库 使用ORAPWD命令创建 语法如下: ORAPWD FILEfilename [ENTRIESnumusers] [FORCE{Y|N}] [IGNORECASE{Y|N}] …

ylb-项目简介

1、各模块服务功能 注&#xff1a;其部分实体类、接口、mapper文件由MyBatis逆向工程生成。 2、Maven管理&#xff08;多模块&#xff0c;继承和聚合&#xff09; 2.1 parent模块 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"…

DevOps系列文章之 Dockerfile 使用流程

制作项目应用镜像 主要步骤&#xff1a; Step1、准备项目应用程序包 Step2、编写Dockerfile及启动脚本 Step3、docker build 构建镜像 Step4、docker run 启动容器 Step5、docker exec 进入容器进行验证 Step6、镜像的导入导出 Step7、提交容器生成新镜像 Step1、准备项目应…

如何缩短 js 解析时间,如何优化首屏(延迟加载)

缩短js解析时间 代码优化 避免全局查找&#xff08;沿着作用域链找需要时间&#xff09;&#xff0c;避免闭包&#xff0c;用数据结构等 减小js的大小&#xff1a;压缩和混淆 压缩 剔除没用到的代码&#xff0c;把长表达式转换成同含义的短表达式等 语法转换和优化&#…

c++ 无锁队列的简单实现

无锁队列的基本介绍 一个关于无锁队列的多线程读写代码示例。在这里&#xff0c;我提供一个简单的示例来说明这个问题。 在使用无锁队列时&#xff0c;需要注意以下几点&#xff1a; 使用原子操作来实现对队列的读写操作&#xff0c;以避免多线程同时访问同一数据导致的竞争条…

在SPringBoot生成验证码

1.引入依赖,这个依赖中包含了生成验证码的工具类 <!--引入hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.9</version></dependency> 2.编写配置类 import cn.hu…

Linux字符设备操作函数

Linux字符设备操作函数是指对字符设备进行打开、关闭、读取、写入、控制等基本操作的函数&#xff0c;它们通过字符设备结构体中的 file_operations 结构体来定义。常用的字符设备操作函数包括&#xff1a; 1、open: 当一个进程试图打开设备文件时&#xff0c;调用这个函数。开…

华润燃气牵手腾讯云 数字技术助力燃气行业高质量发展

7月13日&#xff0c;华润燃气与腾讯云正式签署战略合作协议。双方将充分发挥各自优势&#xff0c;探索AI大模型在燃气行业的深度应用&#xff0c;并深耕分布式计算、连接和客户运营等领域&#xff0c;不断提升燃气民生服务的效率、质量&#xff0c;共同推动行业数字化转型和高质…

ASEMI快恢复二极管MUR20100CTR在电子工程中的应用

编辑-Z 随着电子技术的日益发展&#xff0c;各种电子元件的使用场景与需求也在逐步扩大。今天&#xff0c;我们将聚焦于一款广泛应用于各类电路的二极管——MUR20100CTR&#xff0c;来详细解读其性能特征及应用。 一、MUR20100CTR二极管的主要特性 MUR20100CTR是一款极高性能的…

DataTable数据对比

DataTable数据对比 文章目录 DataTable数据对比前言一、计算DataTable差集结构不同的情况结构相同的情况 二、计算DataTable交集结构不同的情况结构相同的情况 三、计算DataTable的并集合两个DaTable结构相同的情况计算并集 前言 开发中我们经常会出现查询数据库后返回DataTab…

【iOS安全】iphone出现support.apple.com/iphone/restore

解决iphone出现support.apple.com/iphone/restore 解决方法1&#xff1a;使用爱思助手 可能是因为手机进入了恢复模式 手机连接Mac端的爱思助手之后&#xff0c;使用爱思助手的“退出恢复模式” 经测试有效 解决方法2&#xff1a;iphone强制重启 强制重新启动iPhone8或iPhone…

[Java]Set、Map、List常见实现类的特点、使用方法总结

文章目录 1、图谱2、List1、ArrayList1. 特点2. 常见方法 2、LinkedList1、特点2、常见方法 3、Vector1、特点 3、Map1、HashMap1、特点常用方法 2、TreeMap1、特点 3、LinkedHashMap1、特点 4、Set1、HashSet1 、特点2、常用方法 2、LinkedHashSet特点 3、TreeSet1、特点2、使…

Python - Django 框架 - 设置SECRET_KEY

在Django中&#xff0c;SECRET_KEY是一个重要的配置项&#xff0c;用于加密和保护用户数据、会话和其他敏感信息。下面是设置SECRET_KEY的几种常见方法&#xff1a; 1、在settings.py文件中硬编码设置&#xff1a; 打开项目中的settings.py文件&#xff0c;并在其中定义一个字…