Linux调试工具—gdb

news2024/11/29 5:43:58

                                                         🎬慕斯主页:修仙—别有洞天

                                                         ♈️今日夜电波:HEART BEAT—YOASOBI

                                                                2:20━━━━━━️💟──────── 5:35
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

什么是gdb?

gdb的安装

如何读取可执行程序格式

gdb的调用

前提

唤醒gdb

gdb的使用

gdb的基本使用

list/l 命令

break(b) 命令

info命令

开始调试

run/r

n/next s/step 和 c/continue

print(p)

display和undisplay

until

finish

breaktrace/bt

set var


什么是gdb?

        GDB,全称为GNU项目调试器(GNU Project Debugger),是一个功能强大的程序调试工具,主要用于Linux环境下的软件开发。它允许开发者查看程序在执行时的内部活动,或者在程序崩溃时正在执行的操作。

GDB主要用于调试C和C++程序,但也支持其他多种编程语言编写的程序,包括C、C++、Go、Objective-C、OpenCL等。其主要功能如下:

  1. 启动程序:可以自定义地运行程序。
  2. 断点设置:可以让被调试的程序在指定的断点处停住,便于分析。
  3. 单步执行:可以逐行执行程序代码,观察程序运行状态。
  4. 打印变量:可以在程序运行过程中查看或改变变量的值。
  5. 观察变量:可以动态查看程序中的变量值的变化情况。
  6. 寄存器查看和堆栈查看:可以查看当前程序运行的寄存器状态以及调用堆栈信息。

        对于从事 Linux C/C++ 开发的程序员来说,GDB是主要的调试工具,尤其在没有IDE环境的嵌入式系统等资源限制的场景下,GDB以其占用资源少、开源免费和方便实用而被广泛使用。

gdb的安装

yum install -y gdb//centos系统下下载,注意要在root模式下
apt-get install -y gdb//ubuntu系统下下载,注意要在root模式下

安装成功显示如下:

如何读取可执行程序格式

        我们在linux中形成可执行程序的格式为ELF格式

阅读可执行程序的格式:

readelf -S 可执行程序名 -g//debug模式
readelf -S 可执行程序名 -r//release模式
readelf -S 可执行程序名 -g | grep -i 关键字//debug模式下查找关键字
readelf -S 可执行程序名 -r | grep -i 关键字//release模式下查找关键字

gdb的调用

前提

        编译程序前需要加上 -g 选项 用以表示为debug模式 ,如果不加默认为release模式,release模式下不能进行调试因为release模式下没有调试用的程序而debug模式下有调试用的程序。

        如下为示例Makefile:

 process:main.c process.c
    gcc -o $@ $^ -g                                                              
 .PHONY:clean
  clean:
    rm -rf process

唤醒gdb

gdb binFile //gdb 编译后的程序名

成功唤醒后进入如下状况:

gdb的使用

gdb binFile  

退出: ctrl + d 或 quit

调试命令:
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

finish:执行到当前函数返回,然后停下来等待命令

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

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的基本使用

list/l 命令

        显示binFile源代码,接着上次的位置往下列,每次列10行,当使用过一次list或者l后,每次使用回车会继续显示接下来的10行代码。

        当然也可以配合list/l 行号来查看对应行数的代码。通常而言:l/list 行号 会显示包括它周围的10条代码,简单的来说就是以要显示行数为中心,然后显示前5行和后5行代码。如果 l/list 行号 前面的代码行数不够则会向后补齐到10条,如果后面的行数不够则不会补齐,只会显示他周围的代码。

        也可以以list/l 函数名 来显示某个函数的源代码。

break(b) 命令

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

info命令

        这里主要讲info+断点的操作 info break :查看断点信息。info(或i) breakpoints:参看当前设置了哪些断点。info(i) locals:查看当前栈帧局部变量的值

关键字+breakpoints

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

        当然disable breakpoints和enable breakpoints也是可以指定序号来进行禁用以及启用的,只需要在后面添加相应的序号即可,注意这个序号为断点Num下的序号。

开始调试

run/r

        通常,当我们打完断点后就要开始调试了,对此我们要直接运行到断点处可以只用run/r 直接运行,这个实际上就相当于我们VS中的F5,如果没打断点则会直接运行完。

n/next s/step 和 c/continue

        在运行到断点后,我们通常会进行逐语句或者逐过程的调试,n 或 next:单条执行。s或step:进入函数调用。这就对应着逐过程和逐语句。即VS中的F10和F11。continue(或c)则是直接跳到下个断点处,如果接下来没断点则运行完后面的代码(前提是已经运行到了某个断点)。

print(p)

        print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。p 变量:打印变量值。p &变量则为打印地址地址。

display和undisplay

        display 变量名:跟踪查看一个变量,每次停下来都显示它的值。undisplay:取消对先前设置的那些变量的跟踪。使用display跟p是一样的都可取变量和地址,然后每次运行n/s或者每次停下来都显示display后的值,如果不想显示某个值我们可以通过undisplay+display后最前面的序号来取消显示。

until

        until X行号:跳至X行。在跳至X行时会将中间的代码也顺便运行显示出来。

finish

        finish:执行到当前函数返回,然后停下来等待命令。如下我们进入到add函数,再使用finish,这可以用来检测函数是否有问题。

breaktrace/bt

        breaktrace(或bt):查看各级函数调用及参数。实际上就是查看调用堆栈。

set var

        set var:修改变量的值。我们可以用set var 变量名=要变成的值 用此来修改变量的值。


                          感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                         给个三连再走嘛~  

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

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

相关文章

Django 学习教程- Django模板(Template)

系列 Django 学习教程-介绍与安装-CSDN博客 Django 学习教程- Hello world入门案例-CSDN博客 前言 在上一章节中我们使用django.http.HttpResponse() 来输出 "Hello World!"。该方式将数据与视图混合在一起,不符合 Django 的 MTV 思想。 本…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

c++_08_操作符重载(操作符重定义) 友元

1 操作符标记 单目操作符&#xff1a; - -- * -> 等 双目操作符&#xff1a; - > < - << >> 等 三木操作符&#xff1a; ? : 2 操作符函数 2.0 前言 C编译器有能力把一个由操作…

Ubuntu之修改时区/时间

1、查看当前时间及时区状态 sudo timedatectl status # 显示当前时区为Asia/Shanghai 2、查看当前系统时间 sudo date 3、查看当前系统时间及时区 sudo date -R # 显示当前时间及对应时区&#xff0c;时区为“0800”北京时区 4、修改硬件时间 修改日期格式&#xff1a…

论虚继承的作用

虚继承 实验介绍 在上一小节中学习了多继承与多重继承,实际在开发的时候可能会遇到一种情况,既用到了多继承又用到了多重继承,这种继承方式通常又称为菱形继承。但这样一来就会产生新的问题,过多消耗空间。希望通过本小节学习能知道菱形继承以及产生的问题和解决方式。 …

buuctf-Misc 题目解答分解103-105

103.[GKCTF 2021]签到 追踪流发现类似flag 字符 f14g 下面有大量的是16进制字符 64306c455357644251306c6e51554e4a5a3046355355737764306c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e65556c7154586c4a616b31355357704e655…

动态内存管理篇

为什么要动态内存分配&#xff1f; 之前&#xff0c;我们向内存申请空间&#xff0c;有两种方式&#xff0c;一种是定义变量&#xff0c;一种是建立数组&#xff1b;但是&#xff0c;这两种方式都有缺陷&#xff0c;创建的空间大小是固定的&#xff0c;在程序的运行过程中&…

操作系统(Operator System)

这里写目录标题 1. 什么是操作系统2. 主要功能3. 计算机的层状结构4. 什么叫做管理5. 总结6. 为什么要有操作系统7. 最后 1. 什么是操作系统 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运…

PostgreSQL PG的流复制搭建

注: 本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。【PostgreSQL】PG的流复制搭建 - 课程体系 - 云贝教育https://www.yunbee.net/Home/News/detail/article_id/510.html 一 、主备机…

HarmonyOS资源分类与访问

资源分类与访问 应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同…

仿网易云音乐网站PHP源码,可运营的原创音乐分享平台源码,在线音乐库系统

源码介绍 使用PHP和MYSQL开发的原创音乐分享平台源码&#xff0c;仿网易云音乐网站。用户可以在网站上注册并上传自己的音乐作品&#xff0c;系统内置广告系统&#xff0c;为网站创造收入来源。 安装教程 1.导入sql.sql 2.修改 includes\config.php 数据库信息和网址都改成…

【教3妹学编程-算法题】一年中的第几天

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开森。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;经过了一周多的寒潮&#xff0c;天气总算暖和些了。 2哥&#xff…

最新ChatGPT网站AI系统源码,附详细搭建教程/支持GPT4.0/AI绘画/GPT语言对话/DALL-E3文生图/自定义知识库

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

搭建 Mac系统Arduino + MindPlus开发环境

搭建 Mac系统Arduino MindPlus开发环境 1.概述 2024年1月1号&#xff0c;元旦大家的安排丰富多彩&#xff0c;在这一天中我的安排依旧坚持初心&#xff0c;牢记使命。学习是我的起点也是我的终点&#xff0c;只要活着就要用知识丰富自己的生活。 今天是一个有意义的日子&…

GVRP实验配置

GVRP&#xff08;GARP VLAN Registration Protocol&#xff09;&#xff0c;称为VLAN注册协议。 GVRP基于GARP的工作机制&#xff0c;是GARP的一种应用。GVRP用来维护交换机中的VLAN动态注册信息&#xff0c;并传播该信息到其它的交换机中。支持GVRP特性的交换机能够接收来自其…

Servlet见解3

13 Cookie和Session http协议是一个无状态的协议&#xff0c;你每一个跳转到下一个页面的时候都是需要先登录才能使用&#xff0c;这样就很麻烦比如淘宝&#xff0c;没有cookie和session的话&#xff0c;用户在首页已经登录上去了&#xff0c;但是需要再次登录才能选择商品&am…

无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT

TF-IDF TF-IDF是一种经典的基于统计的方法&#xff0c;TF(Term frequency)是指一个单词在一个文档中出现的次数&#xff0c;通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数&#xff0c;通常一个单词…

JMeter(十六)-JMeter断言

十六、JMeter断言 1.简介 断言组件用来对服务器的响应数据做验证&#xff0c;常用的断言是响应断言&#xff0c;其支持正则表达式。虽然我们的通过响应断言能够完成绝大多数的结果验证工作&#xff0c;但是JMeter还是为我们提供了适合多个场景的断言元件&#xff0c;辅助我们来…

Redis原理及常见问题

高性能之道 单线程模型基于内存操作epoll多路复用模型高效的数据存储结构redis的单线程指的是数据处理使用的单线程,实际上它主要包含 IO线程:处理网络消息收发主线程:处理数据读写操作,包括事务、Lua脚本等持久化线程:执行RDB或AOF时,使用持久化线程处理,避免主线程的阻…

服务器监控软件夜莺部署(一)

文章目录 一、夜莺介绍1. 简介2. 相关网站 二、夜莺部署1. 部署架构2. Docker启动3. 配置数据源4. 内置仪表盘效果5. 时序指标效果 一、夜莺介绍 1. 简介 夜莺监控系统是一款专业的服务器监控软件&#xff0c;它可以帮助用户实时监测服务器的CPU、内存、磁盘利用率等。 夜莺监…