gdb常用调试命令 解决Segmentation fault

当linux进程因内存泄露出现Segmentation fault等难以用肉眼解决的bug时,可以采用gdb调试的方法。

要使用gdb调试,首先在编译时,必须包含-g选项,如:

gcc debug.c -g -o debug

或者在makefile的CFLAGS必须包含-g选项,如:

CFLAGS = -g


一、进入gdb
程序编译完成,运行二进制文件时,有以下3种类型启动gdb调试工具:
(1) [root@localhost build]# gdb ./
(gdb)r -args

第一行先运行程序,如程序运行需要将参数带入,则使用第二行将参数带入,r代表run,即运行程序;

(2) [root@localhost build]# gdb -p

若程序已经运行,则可以从另外一个会话窗口中,通过ps命令查到该程序的pid,然后通过-p方法将gdb attach到该程序;

(3) gdb -args ./ -
若程序运行需要将参数带入,可以通过-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时,该命令可定位到异常发生的位置

各种命令也可以适当地使用首字母缩写的方式运行。


你可能感兴趣的:(gdb常用调试命令 解决Segmentation fault)