要使用gdb调试,首先在编译时,必须包含-g选项,如:当linux进程因内存泄露出现Segmentation fault等难以用肉眼解决的bug时,可以采用gdb调试的方法。
或者在makefile的CFLAGS必须包含-g选项,如:gcc debug.c -g -o debug
CFLAGS = -g
一、进入gdb
程序编译完成,运行二进制文件时,有以下3种类型启动gdb调试工具:(1) [root@localhost build]# gdb ./<programe_name>
(gdb)r -args
(2) [root@localhost build]# gdb -p <programe_pid>第一行先运行程序,如程序运行需要将参数带入,则使用第二行将参数带入,r代表run,即运行程序;
(3) gdb -args ./<programe_name> -<programe_args>若程序已经运行,则可以从另外一个会话窗口中,通过ps命令查到该程序的pid,然后通过-p方法将gdb attach到该程序;
若程序运行需要将参数带入,可以通过-args的方法将参数直接启动gdb调试,和第一种启动gdb的方法实质上是一样的。
二、退出gdb
(gdb)quit
三、gdb常用调试命令
(1)list命令
(gdb) list # 显示listsize行
(gdb) list 10 # 显示第10行附近的内容
(gdb) list func1 # 显示func1函数附近的行
(gdb) show listsize# 显示默认list命令显示的行数
(gdb) set listsize <15># 设置默认list命令显示的行数为15
(2)search命令
(gdb) search variable_name # 查找字符串位置
(3)break命令
(gdb) break func1# 在func1函数开始运行时,停止
(gdb) break 26 # 在line 26行设置断点
(gdb) break debug.c:24# 在文件debug.c的24行设置断点
(gdb) clear func1 # 删除func1函数上的断点
(gdb) clear 26 # 删除26行的断点
(gdb) clear debug.c:func1# 删除debug.c文件中func1函数上的断点
(gdb) info break# 查看断点信息
(4)运行程序
(gdb) run# 运行待调试程序,当第一次进入gdb时,或者程序发生Segmentation fault重新运行时使用
(gdb) continue# 当程序运行到断点处后继续执行
(gdb) next # 单步调试(逐行运行程序)
(gdb) step # 单步调试(遇到函数时,进入该函数)
(5)查看变量
(gdb) p p_var# 若p_var为一个指针,打印该指针的地址
(gdb) p *p_var# 若p_var为一个(结构体)指针,打印指针指向的(结构体)值
(gdb) p p_var->aaa# 若p_var为一个结构体指针,打印该结构体指针里的某个值
(gdb) p var=1 # 人为将变量var赋值为1
(gdb) p /x var# 以16进制方式查看var的值
(gdb) info args# 查看带入该函数的参数值
(6)跟踪异常
(gdb)bt #当程序发生Segmentation fault时,该命令可定位到异常发生的位置
各种命令也可以适当地使用首字母缩写的方式运行。