gdb调试工具
程序员在写程序的时候不可能是一帆风顺,一蹴而就的。gcc编译器可以发现程序代码的语法错误,但不能发现程序的业务逻辑错误,调试程序是软件开发的内容之一。调试程序的方法有很多种,例如可以用printf语句跟踪打印程序的运行步骤和变量的值,但是太过麻烦。此文章介绍一个Linux系统中强大的调试工具---gdb。
GDB(GNU Debugger)是GCC的调试工具。其功能强大, 现描述如下:
GDB主要帮忙你完成下面四个方面的功能:
- 启动程序, 可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的断点处停住。(断点可以是条件表达式)
- 当程序被停住时, 可以检查此时你的程序中所发生的事。
- 动态的改变你程序的执行环境
gdb的安装
在Linux终端中输入:gdb -v命令,就可以显示gdb的当前版本,表明当前的计算机已经安装gdb。如果现实command not found,则表明该计算机还没有安装gdb调试工具。这时候我们需要切换到root用户,使用命令yum -y install gdb即可安装gdb。前提是该系统可以连接互联网。
调试前的准备
用gcc编译源程序的时候,编译后的可执行文件不会包含程序源代码,如果你打算源程序可以被调试,编译的时候需要加-g参数,例如:
gcc -g hello.c -o hello
然后再终端中输入gdb hello就可以调试hello程序。
启动gdb
- 启动gdb:gdb program
program 也就是你的执行文件, 一般在当前目录下。
- 设置运行参数
- set args 可指定运行时参数。(set srgs main.c)
- show args 命令可以查看设置好的运行参数。
- 程序调试
- run(r):程序开始执行, 如果有断点, 停在第一个断点处
- next(n):开始执行当前语句,如果该语句为函数调用,不会进入函数内部
- step(s):开始执行当前语句,如果该语句为函数调用,则进入函数内部第一条语句。如果函数是库函数或者第三方函数,用s也没用,因为没有源代码,如果是自定义函数,只要有源代码就可以进函数内部。
- continue(c):程序继续运行直到下一个断点处停下来
- start:程序向下执行一行。(在第一条语句处停止)
- quit(q):退出gdb调式
- 显示源代码
- list linenum:打印第linenum行的上下文内容.
- list function:显示函数名为function的函数的源程序。
- list: 显示当前行后面的源程序。
- list -:显示当前文件开始处的源程序。
- list file:linenum: 显示file文件下第n行
- list file:function: 显示file文件的函数名为function的函数的源程序
- 断点设置与取消
- break(b):设置断点,可以设置多个断点(b 20)
- info break(i b):查询所有断点
- delete(d):删除断点,delete后面可以跟多个值
- disable(dis):设置断点无效
- enable(ena):设置断点有效,与disable相反
- 查看变量
- print(p):显示变量的值(p variable)
- ptype:显示变量类型