Linux调试器-gdb使用

目录

引言

gdb指令

l指令(list)

运行程序:r(run)(运行到断点处停止)

打断点:b(break)

删断点:d(delete)

​编辑

调试

监视窗口:指令p(print)

display监视

取消常显示:undisplay

until:在一个函数内,跳转到指定行

finish:直接把一个函数跑完

快速跳到下一个断点C(continue)

[禁用断点(不删除):disable + 断点编号](#禁用断点(不删除):disable + 断点编号)

[set var :修改变量](#set var :修改变量)

bt:显示函数调用信息

[显示该函数内的变量:info locals](#显示该函数内的变量:info locals)

总结


引言

在软件开发的过程中,调试是不可或缺的一环。它帮助我们定位并修复代码中的错误,确保软件的稳定运行。Linux环境下,GDB(GNU Debugger)是一款功能强大的调试工具,它能够为程序员提供强大的程序执行控制、断点设置、变量检查等功能。熟练掌握GDB的使用,对于提升开发效率、确保代码质量具有重要意义。

在发布的软件,一般分为debug版本和release版本。Linux的程序默认用release发布

Debug:含有调试信息

Release:不含有调试信息

因此调试的必须是debug发布的版本。

用debug发布软件:-g

gdb指令

我们写一个简单的小程序。

l指令(list)

进行代码的显示

打开:gdb + 文件 退出:q

l 0,可以让代码从第0行开始显示,l n同理。

gdb存在记忆功能,直接enter可以执行最后一条指令。

可以看到,展出的代码进行了编行。

l+ 函数名 (只看某一个函数)

运行程序:r(run)(运行到断点处停止)

输出3,正常退出。

打断点:b(break)

有多种打断点的形式

b 行号

b 函数名

b 文件名:行号

b 文件名 : 函数名

info b :查看断点信息

包含:序号、 类型、 开启状态 、地址 等信息

需要注意的是q退掉gdb之后,断点信息将不存在。

b 函数名打断点

删断点:d(delete)

需要注意的是,删除断点,删除的是编号,而不是行号

调试

调试分为逐过程(F10)和逐语句(F11)

对应在gdb中分别为 n(next) s(step)

需要注意的是,只有r指令之后,才能进行调试。

n 命令会进入函数体执行函数,但它不会单步执行函数体内的每一行代码 ,除非函数体内有断点。如果函数体内没有断点,GDB 会执行完整个函数并停在函数调用后的下一行。

如果函数体内部的断点打在了循环的地方,那么每次执行 n(或 next)命令时,GDB 会继续执行到下一个断点,包括循环内的断点

再次r可以重新开始执行

s调试:可以看到给出了作用域,并且进入了函数内部

监视窗口:指令p(print)

缺陷:每次都需要调用p(print)去查看

display监视

当不出本作用域,可以一直监视。

当我们再次run之后,发现进行了display,当进入add作用域之后display失效

出add作用域,display再次生效。

取消常显示:undisplay

需要注意的是,undisplay需要跟展示的编号,而不是变量。

until:在一个函数内,跳转到指定行

until之后,直接省去循环(0 - 9)跳到了15行

finish:直接把一个函数跑完

快速跳到下一个断点C(continue)

如果在两个断点直接出现了报错,就可以确定出错的区间

c 、 finish 、 until帮助我们快速定位区间

禁用断点(不删除):disable + 断点编号

发现断点的状态都是enable状态

禁用断点是disable

enable重新打开

set var :修改变量

set var可以直接将变量修改,可以用于修改循环次数、、、

bt:显示函数调用信息

显示该函数内的变量:info locals

总结

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

相关推荐
boy快快长大12 分钟前
EasyTier初次使用
服务器
中屹指纹浏览器svip15 分钟前
指纹浏览器RPA自动化靠谱吗?先分清适用边界
运维·自动化·rpa
zuiyuewentian19 分钟前
借助 AI 在 Win11 上搭建 Rocky Linux:用 Visual Studio 直接调试 Linux 服务
linux·运维·visual studio
牢姐与蒯22 分钟前
WSL2 迁移教程:把Ubuntu+WSL2从C盘挪到别的盘
linux·运维·服务器·网络·ubuntu·1024程序员节
垆边人似月.25 分钟前
RDMA 文件传输踩坑(二):为什么 `sleep()` 不能保证接收端准备好了?
linux·服务器·网络·rdma
zxanz129 分钟前
证书运维自动化,守住业务 HTTPS 底线
运维·https·自动化
vipxieliang33 分钟前
Service Mesh 可观测性:分布式追踪、指标与日志的统一方案
运维
DYWorker0011 小时前
第 1-10 课: 横切设施:锁、RCU、安全与观测怎么选?
linux
臻一1 小时前
rk3568---ftp无法连接
linux·ftp·3568
云飞云共享云桌面1 小时前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造