什么是GDB?
GDB 是由 GUN 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多 类Unix系统的标准开发环境。可以用来调试C、C++、Go、java、 objective-c、PHP等语言。
GDB的作用
- 程序启动时,可以按照自定义的要求运行程序,例如设置参数和环境变量;
- 可以让被调试的程序在所指定的代码处暂停运行,并查看当前运行状态 (例如当前变量的值,函数的执行结果),即支持断点调试;
- 当程序被停住时,可以检查当前程序的中的变量的状态;
- 在程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误。
安装GDB(CentOS7)
- 查看是否安装
rpm -qa | grep gdb
说明已经安装了。
- 如果没有安装,使用以下命令:
sudo yum install -y gdb
如何生成有调试信息的程序
Linux gcc/g++出来的二进制程序,默认是release(发布版本)模式,在编译命里里面加 -g 的选项,在进行make
即可生带DeBug( 调试版本 )版本的可执行程序。 一般会在系统出现错误时,利用core文件来进行调试,有关于如何生成code文件以及一些相关的问题
使用GDB
先来介绍一些调试代码
l(list) 行号/函数名
—— 显示对应的code,每次10行,也可以通过l xx xx
来查看xx-xx行的源码。
*r(run)
【无断点直接运行、有断点从第一个断点处开始运行】
b(breakpoint) + 行号
—— 在那一行打断点b 源文件:函数名
—— 在该函数的第一行打上断点b 源文件:行号
—— 在该源文件中的这行加上一个断点info b
—— 查看断点的信息- 其中:
Num —— 编号
Type —— 类型
Disp —— 状态
Enb —— 是否可用
Address —— 地址
What —— 在此文件的哪个函数的第几行 d(delete) + 当前要删除断点的编号
—— 删除一个断点d + breakpoints
—— 删除所有的断点disable b(breakpoints)
—— 使所有断点无效enable b(breakpoints)
—— 使所有断点有效disable b(breakpoint) + 编号
—— 使一个断点无效enable b(breakpoint) + 编号
—— 使一个断点有效enable breakpount
—— 使一个断点有效n(next)
—— 逐过程s(step)
—— 逐语句bt
—— 看到底层函数调用的过程set var
—— 修改变量的值p(print) 变量名
—— 打印变量值display
—— 跟踪查看一个变量,每次停下来都显示它的值undisplay + 变量名编号
—— 取消对先前设置的那些变量的跟踪until + 行号
—— 进行指定位置跳转,执行完区间代码finish
—— 在一个函数内部,执行到当前函数返回,然后停下来等待命令c(continue)
—— 从一个断点处,直接运行至下一个断点处quit
退出gdb