文章目录
- 一、gdb简介
- 二、gdb的安装
- 三、gdb使用
- 3.1、release和debug版本
- 3.2、gdb基本使用命令
- 1、启动gdb
- 2、调试命令
- 3、显示代码(list)
- 4、断点命令(breakpoint)
- 5 、变量命令(variable)
- 6、特殊调试命令
- 7、调用堆栈命令
- 8、显示当前函数内临时变量:info locals
一、gdb简介
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;
二、gdb的安装
sudo yum install -y gdb
三、gdb使用
3.1、release和debug版本
在进行程序开发的过程中,有两个版本,一个是release版本,一个是debug版本。我们都知道,如果要进行调试程序,这个程序必须的debug版本的我们才可以进行调试的。
在Linux中查看程序版本:
readelf -S test
这里我们可以发现并没有关于debug的信息。其实在Linux中,gcc/g++
编译器默认生成的版本是release版本的,如果想进入debug版本,我们就要带-g
选项
gcc mytest.c -o mytest -g
总结:
- 程序的发布方式有两种,debug模式和release模式
- Linux中gcc/g++编译器默认生成的可执行程序是release模式
- 要使用gdb调试,必须加上 -g 选项
3.2、gdb基本使用命令
1、启动gdb
gdb + 可执行程序文件,如下:
gdb mytest_g
gdb -q mytest_g //表示不打印gdb版本信息,界面较为干净;
2、调试命令
与vs中的调试命令进行对比:
gdb中:
名称 | 命令 | 解释 |
---|---|---|
开始运行 | run(r) | 相当于开始调试F5 ,执行代码后会在断点处停下 |
逐语句 | step(s) | 相当于F11 ,有函数会进入函数内部 |
逐过程 | next(n) | 相当于F10 ,不会进入函数内部,执行整条语句; |
像逐过程、逐语句这样的命令一次输入之后,可直接回车仍会再次执行。
vs2019中:
运行演示:
-
直接调试
-
逐过程
-
逐语句
3、显示代码(list)
名称 | 命令 | 解释 |
---|---|---|
可指定行号 | list(l) + [N] | 从第 N 行开始显示 10 行代码,可接着上次的位置继续打印 |
可指定函数名 | list(l) + Name | 从函数起始位置左右开始显示代码 |
4、断点命令(breakpoint)
名称 | 命令 | 解释 |
---|---|---|
某行打断点 | b + N | 在某行打上断点 |
函数打断点 | b + FuncName | 在函数内起始位置打断点 |
查看断点 | info + b | 显示断点信息列表 |
删除断点 | d + N | 删除序号为 N 的断点,省略序号就是删除所有断点 |
启用断点 | enable + N | 启用序号为 N 的断点,省略序号就是启用所有断点 |
禁用断点 | disable + N | 禁用序号为 N 的断点,省略序号就是禁用所有断点 |
5 、变量命令(variable)
名称 | 命令 | 解释 |
---|---|---|
监视变量 | display + ValName | 以列表的形式常显示在屏幕下方,类似于vs中的监视 |
取消监视 | undisplay + N | 去掉监视列表中的序号为 N 的变量的常显示 |
查看变量 | p + Name | 打印变量的值,不会常显示 |
修改变量 | set + Name | 设置指定变量的值 |
6、特殊调试命令
名称 | 命令 | 解释 |
---|---|---|
结束当前函数 | finish | finish 会直接结束当前函数的调用,并停止在函数返回位置 |
继续运行 | continue(c) | continue 继续运行至下一个断点,相当于F5 |
运行至指定行 | until + N | 运行至当前函数内部的第 N 行 |
7、调用堆栈命令
名称 | 命令 | 解释 |
---|---|---|
调用堆栈 | breaktrace/bt | 查看程序各级栈帧的调用情况 |
8、显示当前函数内临时变量:info locals
名称 | 命令 | 解释 |
---|---|---|
显示当前函数内临时变量 | info locals | 显示当前函数内临时变量 |