Linux基础工具|代码调试工具gdb的使用

1.debug/release

gdb是一款Linux下的一款调试器,在没有图形化界面下,是一种不错的调试方案(虽然在一般的开发环境中很少会使用gdb

不过要使用gdb,就先要了解debugrelease版本。

发布软件的时候有一种叫debug版本,另外一种叫release版本,在debug中包含了调试信息,所以一般生成的debug文件会比release大一些。而release版本文件对程序做了较大的优化,因此文件会小一些。

gcc/g++默认生成的可执行程序是release版本。但是gdb只能调试debug版本的文件,这个时候就需要给gcc/g++添加-g选项来生成release版本的文件。

$ cat main.c
#include <stdio.h>
int add(int num1, int num2)
{int sum = num1 + num2;return sum;
}
int main() 
{int num1 = 10;int num2 = 5;int sum = add(num1, num2);printf("num1: %d\n", num1);printf("num2: %d\n", num2);printf("sum: %d\n", sum);return 0;
}$ gcc main.c a.out-release
$ gcc main.c -g a.out-debug
$ ls 
a.out a.out-g main.c

如果我们需要查看release文件中的调试信息,可以使用命令readelf -S 文件名来读取可执行程序的数据段格式,-S表示读取各个段,在下面可以查看到debug信息,而没有带-g选项生成的可执行程序则没有这一信息(这些试着操作一下,知道行)。

补充:再编译原理中,Linux中形成的可执行程序格式不是立刻全部变成二进制的,而是变成ELF格式,内部含有各种数据段…

利用管道工具可以让我们更加清晰看到这一现象:

$ readelf -S a.out-release | grep -i debug
$ readelf -S a.out-debug | grep -i debug[27] .debug_aranges    PROGBITS         0000000000000000  00001061[28] .debug_info       PROGBITS         0000000000000000  00001091[29] .debug_abbrev     PROGBITS         0000000000000000  00001199[30] .debug_line       PROGBITS         0000000000000000  00001224[31] .debug_str        PROGBITS         0000000000000000  0000126c

2.gdb的基本操作

2.1.打开退出命令

  1. 打开gdb调试界面:gdb debug版的可执行程序

    $ gdb a.out-debug
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/ljp/LimouCodeFile/CodeFile_2/MyFile_2023_9_25/a.out-debug...done.
    (gdb) 
    
  2. 退出gdb调试界面:使用[ctrl + d]或者quit(同时清空断点信息)

2.2.查看代码命令

  1. l/list [行号]:为查看调试的代码,每次显示10行(list 0可以重头开始看源代码文本)
  2. l/list [函数名]:列出某个函数的源代码上下文

2.3.断点操作命令

  1. b/break [源文件名] 源代码行号:设置断点,可以在某个源文件(因为有可能会有多个文件)的特定行号或函数名处设置断点(并且生成的断点编号一直是递增的)
  2. watch设置观察点,当指定变量的值发生改变时中断程序执行(不过要在调试过程中才能设置)
  3. delete 断点/观察点编号:删除断点/观察点,不是使用行号删除,而是删除断点对应的编号,删除所有断点就是delete breakpoints,注意这里就不需要指定文件,因为这里不是靠指定的行号,而是断点编号来取消断点的
  4. disable 断点/观察点编号:禁用断点/观察点,不是使用行号删除,而是断点对应的编号,禁用所有断点就是disable breakpoints
  5. enable 断点编号/观察点:启用断点/观察点,不是使用行号删除,而是断点对应的编号,开启所有断点就是enable breakpoints
  6. info/i b:查看当前设置的所有断点/观察点。其中,查看断点是否被启用在使用命令info b里的Enb那一列,观察点通常被标记为 hw watchpoint等字样,而断点通常被标记为 breakpoint(这里还可以查看一个断点被命中的次数)

补充1:当您退出gdb的时候,所有的断点/观察点信息会被自动清除。

补充2:断点的禁用和启用也叫作“使能断点”。

2.4.执行相关命令

  1. r/runrun 命令用于开始程序的执行。如果您在 gdb 中设置了断点或观察点,在使用 run 命令后,程序将会在第一个断点或观察点处暂停执行,此时您可以进行调试操作(例如单步执行、查看变量值等),类似VS 2022中第一次按下[F5]快捷键开始调试
  2. c/continue:在使用r启用调试后,可以使用c来跳转下一个断点,类似VS 2022中继续使用[F5]快捷键
  3. n/next:逐过程执行程序,但不进入函数内部,相当于VS 2022中的[F10]快捷键
  4. s/step:逐语句执行程序,进入函数内部,相当于VS 2022中的[F11]快捷键
  5. unitl 行号:可以跳转到行号出的代码,在使用for循环的时候很有用,不建议使用这个命令从main()跳到其他函数,这是一种局部性的跳转
  6. finish:执行完当前函数并返回到调用者,并且停下来,这是一种全局性的跳转

2.5.程序状态命令

  1. display 变量名:每次停在断点处时,自动显示指定变量的值,并且会显示对应的编号标识
  2. undisplay 变量编号:则取消显示对应编号的变量的值(注意这里使用的是变变量编号)
  3. print(变量)或p 变量:打印变量的值
  4. info locals:查看当前函数/栈帧的所有局部变量
  5. info args:查看当前函数的参数
  6. bt/backtrace:显示当前的函数调用堆栈。frame切换到指定的堆栈帧。up切换到上一个堆栈帧,down切换到下一个堆栈帧
  7. x:以十六进制格式查看内存内容

2.6.其他常用命令

  1. h/help:获取帮助信息

  2. set var 变量名可:以直接篡改修改某变量的值,有的时候需要查验在同一份代码下不同变量数据的表现

  3. show:显示当前的设置参数

补充:由于gdb有很多重复操作,因此如果需要重复使用一个命令,在gdb中输入第一次命令后,往后只不断按需要回车即可重复使用该命令。

3.gdb的进阶操作

在设计多进程和线程代码中,还有很多相关的gdb命令,哪些也值得查询一下。

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

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

相关文章

使用EPPlus实现C#控件Excel文件内容导入转换

使用EPPlus实现C#控件Excel文件内容导入转换 1.添加EPPlus库 在使用EPPlus库时&#xff0c;你需要确保在项目中添加了正确的引用。你可以通过以下方式添加引用&#xff1a; 打开你的项目。 在“解决方案资源管理器”中&#xff0c;右键单击“引用”并选择“管理NuGet程序包”…

作为一名独立开发者,如何获取客户?

很多程序员想成为一名独立开发者&#xff0c;从事自由职业&#xff0c;最大的困难在于如何赚钱&#xff0c;进一步来说&#xff0c;就是如何找到自己的客户&#xff0c;有很多开发者拥有丰富的经验&#xff0c;优秀的能力&#xff0c;但无法吸引客户。这篇文章的灵感正是为此而…

Python实现猎人猎物优化算法(HPO)优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐

挺多的&#xff0c;比较普遍的是QMT和Ptrade&#xff0c;python语言&#xff0c;易上手&#xff0c;通用性好&#xff0c;要说适用性可以考虑Ptrade&#xff0c;问一下你的客户经理有没有&#xff0c;用Ptrade的券商也多&#xff0c;如果之前用一创聚宽你可以无缝切换&#xff…

单链表详细解析|画图理解

前言&#xff1a; 在前面我们学习了顺序表&#xff0c;相当于数据结构的凉菜&#xff0c;今天我们正式开始数据结构的硬菜了&#xff0c;那就是链表&#xff0c;链表有多种结构&#xff0c;但我们实际中最常用的还是无头单向非循环链表和带头双向循环链表&#xff0c;我们今天先…

ELF文件结构

目录 ELF文件类型 ELF文件结构 通过链接视角分析目标文件 ELF文件头(ELF Header) 节头表 .text代码节 .data 数据节 .rodata 只读数据节 .bss节 其他常见的节 字符串节 符号表 重定位表 通过运行视角分析目标文件 本节内容&#xff1a; ELF文件类型ELF文件结构 …

san.js源码解读之工具(util)篇——splitStr2Obj函数

一、 源码解析 /*** 将字符串逗号切分返回对象** param {string} source 源字符串* return {Object}*/ function splitStr2Obj(source) {var result {};each( // 2source.split(,), // 1function (key) { // 3result[key] key;});return result; }把字符串通过 split 函数以…

【AI视野·今日Robot 机器人论文速览 第三十六期】Tue, 19 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 19 Sep 2023 (showing first 100 of 112 entries) Totally 112 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;In-Hand Object Rotation, RotateIt 提出了一种基于视觉与触觉的物体旋转朝向的方法…

一文了解优先考虑结果的以「意图」为中心的 Intent-Centric 架构

Web3 用户体验成是阻碍区块链被大规模采用的原因之一&#xff0c;而 Intent-Centric 架构形式极大简化了用户的体验门槛。 Ac-Core&#xff1a;实现意图所需元素&#xff1a;1&#xff09;账户抽象&#xff1a;利用捆绑器加代付合约完成适合开发者的狭义意图&#xff1b;2&…

【萌新的RiscV学习之流水线结构的概述-7】

萌新的RiscV学习之流水线结构的概述-7 之前写完了单周期的指令 目前朝着流水线迈进 由于涉及学业机密 就不展示代码了 主要展示学习过程和一些想法 由于时钟周期必须满足所有指令中最坏的情况&#xff0c;所以不能使用那些缩短常用指令执行时间而不改变最坏情况的实现技术。因…

链表(单链表、双链表)

前言&#xff1a;链表是算法中比较难理解的部分&#xff0c;本博客记录单链表、双链表学习&#xff0c;理解节点和指针的使用&#xff0c;主要内容包括&#xff1a;使用python创建链表、实现链表常见的操作。 目录 单链表 双链表 单链表 引入链表的背景&#xff1a; 先来看…

2023年最新电商某东app端sign签名算法与cipher加解密逆向分析(2023-09-26)

前言&#xff1a; 本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01;技术交流合作请私信&#xff01; 一.工具的选择&#xff08;抓包工具的选择&#xff0c;是门学问&#xff09; 用…

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …

深入理解红黑树

小白慎入&#xff01;本文难度比较高&#xff0c;需要对红黑树有一定的了解再来看&#xff01; 红黑树 红黑树是一种高级数据结构&#xff0c;是平衡树大家族中的一员&#xff0c;并且听名字就知道这个玩意不是凡物&#xff0c;可能你从未听过&#xff0c;但是你一定会为这样的…

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

大咖共探AGI时代机遇,腾讯云助力大模型规模化应用提速

引言 2023 年&#xff0c;科技圈的“顶流”莫过于大模型。自 ChatGPT 的问世拉开大模型与生成式 AI 产业的发展序幕后&#xff0c;国内大模型快速跟进&#xff0c;已完成从技术到产品、再到商业的阶段跨越&#xff0c;并深入垂直行业领域。 新技术的爆发&#xff0c;催生新的应…

mdobus ASCII转CAN OPEN JAE1939协议网关

Modbus RTU协议转换网关是一种常见的设备&#xff0c;用于将Modbus RTU协议转换为其他通信协议。而CANopen是一种基于CAN总线的通信协议&#xff0c;主要用于工业自动化和控制系统中。本文将介绍Modbus RTU协议转换网关如何支持CANopen协议&#xff0c;以及该功能的应用场景和优…

洗地机哪个牌子好用又实惠?口碑最好的洗地机推荐

智能技术飞速发展的时代&#xff0c;扫地机器人这类智能家电其实也在顺应潮流和用户需求&#xff0c;不断更新迭代。暂且不说市面上现有多少个洗地机品牌&#xff0c;单单一个洗地机品牌旗下&#xff0c;其实每年都会有多个系列的新品亮相&#xff0c;我们面对的选择多了&#…

javaee之黑马乐优商城6

商品品牌的查询 上面就是我们需要根据分类id去找品牌 假设我们现在拿到的是 商品的分类id&#xff0c;我们需要根据分类id查询出对应的品牌即可 下面我们拿到上面的接口&#xff0c;直接撸代码 这个是和品牌相关联的操作&#xff0c;因为先去看一下BrandMapper,这个mapper是…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…