Linux gdb用法详解

gdb 用法详解

gdb调试简介

   gdb是linux下非常好用的一个调试工具,由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。虽然它是命令行模式的调试工具,但是它的功能强大到你无法想象,gdb 对于一名Linux下工作的c/c++程序员,是必不可少的工具。

安装gdb

输入以下命令,确保在联网状态下。

yum install gdb

之后,系统就会自动下载安装,等待即可。

顺便提一句,以下命令可以查看gdb的安装版本

gdb --version  

gdb的常用命令

  1. 编译可执行文件
    首先编写一个简单的测试程序并保存,然后使用gcc将其编译为可执行文件,同时使用 -g 表示该程序可调试:
gcc -g test.c -o test 

在gcc默认形成的可执行程序是 release ,是无法被调试的。-g 选项告诉 gcc 在编译程序时加入调试信息,使其能够被gdb调试。
如果没有这个选项就会报错:No symbol table is loaded. Use the “file” command

  1. 启动调试
    输入gdb -q + 可执行文件,启动gdb进行调试,q参数可以屏蔽一些 gdb 版本等相关信息。
gdb hello
//或者
gdb -q hello
  1. 查看代码
gdb list  //简写为  gdb l
gdb l 0   //从第一行开始显示代码
  • gdb l 查看代码
  • gdb l 0 从第一行开始显示代码

gdb 会自动记录上一次执行的代码

  1. 执行程序
//在 gdb 模式下,输入r进入调试
r 
  1. 设置断点
    输入 break(b)+数字 可以对程序进行断点操作,数字就是设置断点的代码行数
b 18  //打断点
b mycode.c:20  //对 mycode.c 中的20行打上断点
b main  //对主函数打断点
b mycode.c:Add   // 对 mycode.c 文件中的 Add 函数打断点

gdb 既可以对行号打断点,也可以对函数打断点。

执行效果如下:
在这里插入图片描述
在这里插入图片描述

  1. 删除断点
  • 输入 d + 断点序号
d 1     //删除1号断点

执行完该命令后,1 号断点就会被删除,并且 gdb 不会有任何提示。

  • 删除全部的断点
d breakpoints  //删除所有断点

此命令会有提示,询问是否确定删除全部的断点。输入 y ,表示确定删除。
在这里插入图片描述

  • 清除第n行的断点
clear + n

在这里插入图片描述

  1. 禁用/启用断点
disable 1  //禁用 1 号断点
enable  1  //启用 1 号断点

disable 1,禁用了一号断点。我们再来查看断点信息可以发现,1 号断点的Enb变为了n。而不是之前的y。
在这里插入图片描述
此时再启用断点 1
在这里插入图片描述
可以看到之前被禁用的断点1 ,现在又变为启用状态。

  1. 查看断点信息
    查看断点,每个断点都有依次的编号
info b  //查看断点,每个断点都有依次的编号

执行效果如下
在这里插入图片描述
各个信息的解释

  • Num:断点编号
  • Disp:断点执行一次之后是否有效(keep:有效 dis:无效)
  • Enb: 当前断点是否有效 (y:有效 n:无效)
  • Address:内存地址
  • What:位置

ps:在一次 gdb 的调试周期中,断点的编号是会依次上升的,期间删除断点行号并不会重新排列,一旦退出,断点就会自动消失

例如:
在这里插入图片描述
这里可以看到这里把 2 号断点删除之后重新查看断点的信息。其余两个断点并没有重新排列成 1 和 2,而是依旧维持原有的序号排列。
这里可以说明 gdb 在单次调试周期中。断点的编号是依次上升。且删除断点不会改变其他断点的原有编号。

  1. 单步执行
  • next ( n ) :单步执行程序,但是遇到函数时会直接跳过函数,不进入函数

  • step ( s ):单步执行程序,但遇到函数会进入函数

  • continue ( c ):继续执行程序,直到遇到断点或结束

可以看到执行效果如下:
在这里插入图片描述

  1. 查看变量
  • print + 变量:查看变量值

  • whatis + 变量:查看变量数据类型

print的执行效果:
其中输入 print 或 p 都可以。
在这里插入图片描述
whatis i 查看变量类型:
在这里插入图片描述

  1. 退出

输入q回车即可退出gdb调试模式。

其他命令

  • 运行命令
命令作用
until可以在一个循环内运行程序直到退出循环体
until + 行号运行至某行
finish运行程序,直到当前函数返回完成,并且打印函数返回时的堆栈地址和返回值及参数值等信息
call + 行数 + (参数)调用程序中可见的函数,并传递参数
  • 运行信息
命令作用
where / bt当前运行的堆栈列表
bt backtrace显示当前调用堆栈
up / down改变堆栈显示的深度
set args + 参数指定运行时的参数
show args查看设置好的参数
info program查看程序是否在运行,以及进程号被暂停的原因
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ryan.Alaskan Malamute

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值