【Linux】调试器---gdb的使用

2023-10-27


一.背景知识

  1. 程序的发布方式有两种,debug(调试)模式和release(发行)模式;
  2. Linux gcc/g++出来的二进制程序,默认是release模式;
  3. gdb是Linux中的调试器。用于debug版本代码的调试, 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项

二.安装gdb

sudo yum install gdb //想直接安装就加上-y选项

三.gdb的用法

为了详细解析gdb的各种用法,我们先创建两个文件:test.c和Makefile文件,用于测试gdb。
在这里插入图片描述
以下分别是两个文件中的测试代码:

//test.c:我们用一个从1加到100的程序来测试gdb
#include<stdio.h>
 
 int addToTop(int top)
 {
     printf("enter addToTop\n");
 
     int sum=0;
     for(int i=1;i<=top;i++)
     {
         sum+=i;
     }
     printf("quit addToTop\n");
     return sum;                                                                                                                                                                  
 }
 int main()
 {
     int top=100;
 
     int ret=addToTop(top);
     printf("ret:%d\n",ret);
     return 0;
 }


//Makefile(自动化构建项目的工具)
mytest:test.c //依赖test.c文件生成mytest可执行程序
     gcc test.c -g -o mytest -std=c99 //注意这里加上了-g选项,也用上了c99标准                                                                                                                                        
.PHONY:
make clean:
     rm -f mytest

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

使用须知

程序的发布方式有两种:

  • debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
  • release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
在这里插入图片描述
我们可以使用readelf指令查看ELF格式的文件信息:
在这里插入图片描述对同一份源代码分别生成其release版本和debug版本的可执行程序,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,从上图我们可以看出debug版本中有debug信息,其原因就是以debug版本发布的可执行程序当中包含了更多的调试信息。

gdb的常用指令

1.进入调试

gdb [可执行程序] //在上述我们写的测试代码中,可执行程序命名为mytest
//所以接下来我们就以mytest为例

2.退出调试操作

ctrl+d 或 quit

3.显示源代码

list/l 行号:显示源代码,如果按换行键会接着上次显示的位置往下列,每次只显示10行
list/l 函数名:可以直接定位到函数名的位置

操作示例
在这里插入图片描述
在这里插入图片描述

4.设置断点breakPoint

beak(b) 行号:在某行设置一个断点
b 函数名:在某个函数开头设置断点

操作示例
意思是在源代码的第19行设置断点
在这里插入图片描述
意思是在源代码的addToTop函数开头设置断点,会自动识别到第5行(函数所在处)
在这里插入图片描述

5.查看断点信息/禁用断点/开启断点/删除断点

info b(break)

info b指令会显示出所有的断点,我们刚刚设置了两个断点,所以显示出了两个断点的信息,Num是断点的编号,Enb表示断点的状态,y表示断点正常使用,n表示断点已被禁用。
在这里插入图片描述
想要操作哪个断点不是看这个断点在代码中的行号,而是在断点列表的编号。
禁用断点

disable [断点编号Num]

开启断点

enable [断点编号Num]	

删除断点

d(delete) [断点编号] //不加断点编号,则删除所有已设置的断点

6.运行程序,开始调试run

运行程序后会在断点处停下,就跟我们在Windows下用vs编译器调试一样一样的。不设置断点的话,程序就直接跑完了,并输出结果。

r或run

在这里插入图片描述

7.查看变量

打印变量值

p 变量名

在这里插入图片描述

跟踪查看一个变量(长显示)

display 变量名

在这里插入图片描述

取消对变量的跟踪(取消长显示)

undisplay 变量名

8.其它重要命令

  • set var i=100:将某个变量设置成特定的值
  • continue(或c):从一个断点处,直接运行到下一个断点处
  • until 行号:在函数内,进行指定位置跳转,执行完区间代码
  • bt(或breaktrace):查看调用堆栈
  • info (i)locals:查看当前栈帧局部变量的值
  • n或next:逐过程执行代码
  • s或stap:逐语句执行代码,可以进入函数体内
  • finish:进入一个函数,只执行完该函数,就停下来,比如上述所例举的从1加到100的函数,如果我们这个时候还在执行for循环,我们直接输入finish,就可以直接指向完addToTop函数。
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • info:查看gdb的使用手册
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】调试器---gdb的使用 的相关文章

  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4

随机推荐

  • scala学习-12-scala读取java项目下Src目录下的properties文件

    1 概述 scala读取java项目下Src目录下的properties文件 package scala import java util Properties import java io FileInputStream import s
  • springbootweb请求响应

    web三层架构流程 先是前端传送一个请求给后端 然后controller层接受数据进行处理 传给service层进行逻辑处理再交给dao层 dao层访问数据库 数据库再返回数据给dao层 然后再传给service层处理 最后回到contro
  • ResourceUtils

    ResourceUtils org springframework util ResourceUtils 从资源路径获取文件 判断字符串是否是一个合法的 URL 字符串 static boolean isUrl String resourc
  • Java自动装箱和自动拆箱

    基本类型的包装类 在java中 每一种基本类型都有一个对应的包装类 这些类都在java lang包中 8种基本数据类型所对应的包装类是byte Byte short Short int Integter long Long char Cha
  • 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析

    目前许多代码和资源在进行债券定价时 大多以债券发行日作为贴现值的时间点 但在实际应用中我们常常需要对早就发行的债券进行定价 这就需要计算准确的现金流 现金流日距离当前贴现时间点的时间距离和不同时间距离的零息利率 这一过程会较多使用插值法 还
  • css中的渐变的属性,CSS3 渐变属性(Gradients)-线性渐变(linearGradient)

    通过使用 CSS3 渐变 gradients 你可以减少下载的事件和宽带的使用 此外 渐变效果的元素在放大时看起来效果更好 因为渐变 gradient 是由浏览器生成的 丛本质上来说 既然 background image 属性中的渐变是浏
  • element框架table多选分页时保留原有选中项(vue2和vue3均适用)

    element中table表格多选 分页 1 表格多选 手动添加一个 el table column 设 type 属性为 selection 即可
  • DLT(Direct Linear Transform)算法

    一 定义 直接线性变换解法是建立像点的 坐标仪坐标 和相应物点的物方空间坐标直接的线性关系的解法 直接线性变换解法的特点 不归心 不定项 不需要内外方位元素的起始值 物方空间需布置一组控制点 特别适合于处理非量测相机所摄影像 本质是一种空间
  • 数据结构常用的算法

    一 排序算法 本质上就是按照某种顺序将一组数排好 分多次重复进行 每次只负责把一个数字放到合适的位置上 两种思路 先确定一个数字 然后根据数据找合适的位置 先确定一个位置 根据位置找合适的数字 1 冒泡排序算法 先确定位置 选最前面或者最后
  • 解决protobuf内存泄漏的3种办法

    1 protobuf对象是如何释放 数组 内存的 毫无疑问是 通过调用析构函数 只要让protobuf定义的对象调用析构函数 无论嵌套了多少层数据 包含了多少个数组都可以释放new出来的内存 2 protobuf对象Clear 接口和STL
  • clickhouse系列第三篇之clickhouse客户端使用教程(1.命令行客户端连接)

    文章目录 一 客户端支持的配置项 1 配置项的配置方式 1 1 从命令行传入 1 2 配置文件 2 配置项列表 二 客户端用法 1 非交互模式 1 1 query 参数指定执行语句 1 2 query 参数和发送到stdin的数据联合使用
  • JVM -- 类加载(七)

    一 加载 将类的字节码载入方法区中 内部采用 C 的 instanceKlass 描述 java 类 它的重要 field 有 java mirror 即 java 的类镜像 如对 String 来说 就是 String class 作用是
  • 前端 报错处理(长期更新 2023.9.06)

    目录 一 ECharts 相关 1 1 Error yAxis 0 not found 1 2 Cannot read properties of undefined reading 0 1 3 Cannot read properties
  • Python编程:从入门到实践 动手试一试之8-6

    根据之前学习的返回字典先写了一版 定义函数city countyr 并定义两个形参guojia和city def city country guojia city 定义函数国家和对应的城市 C city guo guojia chen ci
  • 推荐微信小程序常用的几个UI组

    1 WeUI WeUI 是一套同微信原生视觉体验一致的基础样式库 由微信官方设计团队为微信 Web 开发量身设计 可以令用户的使用感知更加统一 包含button cell dialog progress toast article acti
  • ubuntu下安装软件的方法

    一 ubuntu下软件安装 ubuntu系统下 软件安装方法有几种 常用的方法如下 1 使用 apt 工具安装 2 deb 软件包安装 3 自己下载程序源码编译安装 4 通过 ubuntu系统自带的软件中心安装 这种方法不常用 因为一直不太
  • python中SSL/TLS认证失败的解决方案

    重装了ubuntu22 04版本的系统后 跑yolov5的train py脚本时出现以下报错 原因是本地计算机上缺少了需要的根证书 File home anaconda3 envs py37 lib python3 7 urllib req
  • PaddleGAN

    产品动态 人脸编辑神器 StyleGAN V2人脸属性编辑之年龄变换 时光穿梭机 一键实现变老变年轻 完整在线教程 视频超分SOTA算法PP MSVSR 一行命令从 马赛克 到 高清影像 完整在线教程 人脸编辑神器 StyleGAN V2人
  • 爬虫日常练习-艾图网单页面图片爬取

    文章目录 爬虫练习 分析网站 代码设计 下载图片 完整代码 爬虫练习 hello 大家好 好久不见了 无聊的网友今天开始更新关于爬虫的一些日常练习 每次学习完一个新的知识后没有多的案例给自己练习真的很不舒服 希望该系列文章能够让刚刚开始学习
  • 【Linux】调试器---gdb的使用

    文章目录 一 背景知识 二 安装gdb 三 gdb的用法 使用须知 gdb的常用指令 1 进入调试 2 退出调试操作 3 显示源代码 4 设置断点breakPoint 5 查看断点信息 禁用断点 开启断点 删除断点 6 运行程序 开始调试r