Linux环境下gdb调试方法与演示

个人主页:兜里有颗棉花糖

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创

收录于专栏【Linux专栏】🎈

本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌

演示环境:centos7

如果还未安装gdb的话,输入下面命令进行安装即可:

powershell 复制代码
yum install gdb

目录

一、背景引入

首先,gdb是基于命令行式的调试工具。

debugrelease是软件开发过程中的两个不同阶段或模式。debug用于开发和调试软件,并提供更多的调试信息和错误排查的能力。而release用于最终交付给用户和客户的版本,它经过优化和编译,以提供更好的性能和较小的体积。

简单来说就是在软件开发阶段利用debug模式来进行调试,而release模式一般用于公司的测试人员进行最终的测试。

debug版本的代码是可以被调试的(debug版本的代码在形成可执行程序的时候会有调试信息),而release版本的代码不可以调试(没有调试信息)。

在Linux中究竟是使用哪一种模式的代码呢?我们来看一下:

输入命令:gdb test

当然我们无法直接对代码进行调试,我们输入命令:readelf -S test(读取一个可执行程序的二进制构成),请看:

再次发现其中没有debug调试信息,输入命令(查看debug调试信息):readelf -S test | grep -i debug,运行结果如下(发现什么都没有):

所以,通过以上我们就可以知道gcc编译是通过release方式进行发布的,无法进行调试。

二、如果才能进行debug调试

我们需要修改Makefile文件,请看:

通过make命令形成可执行程序如下:

输入命令(查看刚刚新形成的可执行程序test-debug的debug信息):readelf -S test-debug | grep -i debug,结果如下:

之所以test-debug可执行程序能够调试就是因为上图中的debug可调试信息。

总结:如果代码要能够被gdb调试工具进行调试的话,必须由debug发布,Makefile文件中必须加上-g

三、gdb常用选项

gdb常用选项如下:

  • listl 行号:显示源代码文件,接着上次的位置往下列,每次列10行。
  • listl 函数名:列出某个函数的源代码。
  • rrun:运行程序。
  • nnext:单条执行(相当于VS中的F10,即逐过程)。
  • sstep:进入函数调用(相当于VS中的F11,即逐语句)。
  • b/break 行号 :在某一行设置断点。
  • break 函数名:在某个函数开头设置断点。
  • info binfo break:查看断点信息。
  • finish:执行到当前函数返回,然后停下来等待命令。
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。
  • p 变量:打印变量值。
  • set var:修改变量的值。
  • ccontinue:从当前位置开始连续而非单步执行程序。
  • rrun:从开始连续而非单步执行程序。
  • delete breakpoints:删除所有断点。
  • delete breakpoints n:删除序号为n的断点。
  • disable breakpointsdisable 断点序号:禁用断点。
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • enable breakpointsenable 断点序号:启用断点
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值

启动gdb命令gdb 可执行程序

例如:输入命令:gdb test,结果如下:

有两种方式可以退出gdb:
方法1:ctrl + d
方法2:q或者quit
通过list 行号来显示我们编写的源代码,演示如下:

举例:info b

举例(显示断点信息):b 行号

举例:p 变量

举例(跟踪查看一个变量,每次停下来都显示它的值

):display 变量名undisplay 变量名/常显示变量的序号相反

举例:until X行号:跳至X行

相当于跳过一定行数的代码块

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

相关推荐
倔强的石头10637 分钟前
【Linux指南】文件系统基础操作与路径管理
linux·运维·服务器
中科三方2 小时前
如何通过DNS解析实现负载均衡?有哪些优势?
运维·负载均衡
安科瑞刘鸿鹏2 小时前
双碳时代,能源调度的难题正从“发电侧”转向“企业侧”
大数据·运维·物联网·安全·能源
小呆瓜历险记2 小时前
ubuntu 22.04搭建SOC开发环境
linux·运维·ubuntu
码农101号2 小时前
Linux中shell流程控制语句
linux·运维·服务器
ajassi20002 小时前
开源 java android app 开发(十二)封库.aar
android·java·linux·开源
聪明小萝卜2 小时前
无法与IP建立连接,未能下载VSCode服务器
运维·服务器
JuiceFS2 小时前
深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
运维·后端
暗夜潜行2 小时前
ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优
linux·运维·ubuntu
IU宝2 小时前
Linux下基础IO
linux·运维·服务器