一文学习Linux系统下GDB调试
GDB调试命令
如何进入gdb模式
形成可执行程序
- 在linux下使用gcc/g++、makefile或CMake形成可执行程序时,需要加上-g选项,即程序发布的debug模式;如果不加该选项就默认是release模式;
- 如果要进入gdb开始调试,那直接gdb + 可执行程序名即可。
GDB操作指令
行号显示(list)
l 行号/函数名
表示显示包含该行或该函数的10行代码。l
表示列出该源文件中的随机10行内容;l 0
或l 1
表示从从第一行开始往下显示10行的内容;l m
表示显示包含第m行的10行代码;l 函数名
表示显示函数名的前后10行代码;l m,n
表示显示从第m行到第n行的代码。
断点设置(break)
b 行号
表示在该行打断点;b 源文件:行号
表示在该源文件中的这行加上一个断点;b 源文件:函数名
表示在该函数的第一行打上断点。
查看断点信息
info
表示查看所有的调试信息;info b
表示查看所有断点的信息;- 断点的字段信息:
- Num —— 编号
- Type —— 类型
- Disp —— 状态
- Enb —— 是否可用
- Address —— 地址
- What —— 在此文件的哪个函数的第几行
删除断点
d + 当前要删除断点的编号
表示删除一个断点,不可以d + 行号;d + breakpoints
表示删除所有的断点;- 删除断点后重新打上该断点,该断点编号没有恢复,而是继续上面的编号;因为没有退出过gdb,所以会持续上一次的编号继续往下。
开启 / 禁用断点
disable b(breakpoints)
表示使所有断点无效(默认缺省);enable b(breakpoints)
表示使所有断点有效(默认缺省);disable b(breakpoint) + 编号
表示禁用该断点(不删除);enable b(breakpoint) + 编号
表示开启该断点;
运行 / 调试
r(run)
,用于启动/重新启动被调试的程序,相当于F5
:无断点,直接运行到程序结束;有断点,在第一个断点处停止运行;- 程序停止后,再
run
相当于重新开始。
逐过程和逐语句
n(next)
表示逐过程(单步跟踪),相当于F10
。F10是在当前的函数执行过程中进行单步调试,不会进入到执行函数的内部进行更加详细的调试过程。s(step)
表示逐语句(单步跟踪进入),相当于F11
。F11是需要进入到当前执行函数的内部,进行更加详细的调试的过程。你可以使用finish
命令来执行完当前函数的剩余部分并返回到上一层调用。n 和 s
都是在两个断点之间执行调试。
打印 / 追踪变量
p(print) 变量名
表示打印变量值;display 变量名/结构体
表示跟踪查看一个变量,每次停下来都显示它的值;undisplay 变量名编号
表示取消对先前设置的那些变量的跟踪。
查看函数调用
bt
查看底层函数调用的过程(函数压栈)。
修改变量的值
set var 变量 = 值
修改变量的值,在调试过程中进行设置变量的值,其他值不变。
指定行号跳转
until 行号
表示进行指定位置跳转,下一步就跳转到执行该行代码,知道遇到断点为止。
强制执行函数
在函数内部使用finish
表示立刻执行完该函数并返回,然后停下来等待命令。
跳转到下一断点
c(continue)
表示从一个断点处,直接运行至下一个断点处(等价于VS
下不断按F5
)。
core文件调试
什么是 core 文件
core 文件,确切说是 core dump 文件,core 是内存的映像,当程序崩溃时,dump 是“扔出来”的意思,即核心已转储,实际上就是有问题的程序运行后,产生“段错误(核心已转储)”时生成的具有堆栈信息和调试信息的文件。
如何生成 core 文件
- 使用 ulimit -c 查看core开关,如果为0表示关闭,不会生成core文件;
- 使用 ulimit -c [filesize]设置core文件大小,当最小设置为4之后才会生成core文件
- 使用 ulimit -c unlimited 设置core文件大小为不限制,这是常用的做法
调试过程
- 编译时加上-g选项,程序运行出现错误,在当前目录生成core文件。
- 使用core文件记录的信息进入程序调试
gdb XX.exe -c core.XX
,-c可以省略。 - 进入调试环境后,gdb 会直接给出代码奔溃的位置。
- 使用
l
可以显示崩溃点上下文代码。 - 使用
bt
可以查看崩溃点附近调用栈信息;f + n
表示进入栈的第n层;down
表示进入栈的下一层(更深层),up
表示退回到栈的上一层。
- 使用
跟踪正在运行的程序–gdb attach
- 在运行程序的同时,打开另一个端口。
- 使用top查看进程编号。
- 输入
gdb
进入调试环境。 - 输入
attach
命令跟踪该进程,显示运行报错。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 一只大笨熊!
评论