Linux基本开发工具:gdb和cgdb的使用

一.什么是gdb和cgdb

GDB:GNU Debugger,GNU 官方调试器,Linux 下命令行程序调试工具

只能调试带调试信息 的程序,编译时必须加 -g 参数

复制代码
gcc test.c -o test -g

gdb 作用

  1. 设置断点,程序运行到断点自动停下
  2. 单步执行,一行一行跑代码
  3. 查看变量值、查看内存、查看调用栈
  4. 分析程序崩溃,定位段错误 (segment fault)

cgdb = gdb 的前端界面,gdb 的外壳,底层还是调用 gdb

  • gdb 是纯黑框,代码和调试命令混在一起,阅读不方便
  • cgdb 分双窗口:上方显示源代码,下方是 gdb 命令行,界面更友好,看代码更舒服

安装:

复制代码
yum install cgdb

启动:

复制代码
cgdb ./test

快捷键:按esc切换源码窗口,按i切回下方 gdb 命令输入框,所有 gdb 命令在下方照常使用。

工具 特点
gdb 原生调试器,纯命令行,无代码预览窗口,所有环境自带
cgdb gdb 图形前端,分屏显示源码,可读性强,需要额外安装

我们也可以在makefile中添加-g

由于gdb不能直观显示,所以我们用cgdb来操作

二.gdb的命令学习

首先进入调试:gdb/cgdb + 编译后的文件名

退出是:quit 或 ctrl + d

1.通过命令进入界面是上面的情形,这时按esc然后ctrl + w可以切换为左右界面

2.若光标不在调试那里显示按i可以切换的左边,esc切换到左边;上下界面同理

3.b+函数名在函数的起始行进行标记;b+行号 在该行进行标记

GDB 常用命令速查表

2.1 查看源码(list)

命令 作用 样例
list / l 显示源代码,从上次位置开始,每次列出10行 list/l 10
list/l 函数名 列出指定函数的源代码 list/l main
list/l 文件名:行号 列出指定文件的源代码 list/l mycmd.c:1

2.2 运行与单步调试

命令 作用 样例
r / run 从程序开始连续执行 run
n / next 单步执行,不进入函数内部(逐过程 F10) next
s / step 单步执行,进入函数内部(逐语句 F11) step
finish 执行到当前函数返回,然后停止 finish
c / continue 从当前位置开始连续执行程序 continue
until X行号 执行到指定行号 until 20

2.3 断点管理

命令 作用 样例
break/b [文件名:]行号 在指定行号设置断点 break 10 / break test.c:10
break/b 函数名 在函数开头设置断点 break main
info break/b 查看当前所有断点的信息 info break
info/i breakpoints 查看当前设置的断点列表 info breakpoints
delete/d breakpoints 删除所有断点 delete breakpoints
delete/d breakpoints n 删除序号为n的断点 delete breakpoints 1
disable breakpoints 禁用所有断点 disable breakpoints
enable breakpoints 启用所有断点 enable breakpoints

2.4 变量查看与修改

命令 作用 样例
print/p 表达式 打印表达式的值 print start+end
p 变量 打印指定变量的值 p x
set var 变量=值 修改变量的值 set var i=10
display 变量名 跟踪显示指定变量的值(每次停止时) display x
undisplay 编号 取消对指定编号的变量的跟踪显示 undisplay 1
info/i locals 查看当前栈帧的局部变量值 info locals

2.5 调用栈与退出

命令 作用 样例
backtrace/bt 查看当前执行栈的各级函数调用及参数 backtrace
quit 退出GDB调试器 quit

注意:当我们使用step时,遇到库函数要用n否则会跳入库函数里面一步一步执行

补充:

1.watch命令

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB会暂 停程序的执⾏,并通知使⽤者

2.set var:暂时更改标志位,便于查看

3.条件断点

相关推荐
vipxieliang18 分钟前
可观测性与安全的融合:统一数据平台的建设实践
运维·openai·自动化运维
叼烟扛炮33 分钟前
Linux 学习笔记(五十四):内网穿透实战——用 frp 让外网访问你的私人电脑
linux·服务器·网络·笔记·学习
starzy19901 小时前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
Android系统攻城狮1 小时前
Linux FFmpeg深度解析之av_guess_format调用流程与实战(三十六)
linux·运维·服务器·ffmpeg·ffmpeg音视频进阶
进击的荆棘1 小时前
Linux系统——线程概念与控制之线程封装
linux·运维·服务器·线程
叼烟扛炮1 小时前
[LangChain] 学习笔记(05):提示词模板(Prompt)与少样本注入(Few-Shot)实战
linux·人工智能·笔记·学习·langchain·prompt
CodeYp20191 小时前
第5讲:Socket 编程 TCP
linux·socket·tcp
咔_1 小时前
有IPv6地址,为什么外面还是连不进来?让同一台服务分别卡在四个位置
linux·计算机网络
apcipot_rain2 小时前
C++转Java日记(05)
java·开发语言·c++