1、GDB基础命令
命令含义r重新执行q退出gdbn下一步c继续执行 b
普通断点
打断点
【普通断点】b file.c :行号
【条件断点】b file.c : 行号 if num == 2
【查看断点】info b
【删除断点】del 2
【禁用/启用】disable / enable 2
watch
观察断点
【监控num】watch num
当被监控变量/表达式的值发生改变时,程序停止运行
【查看观察断点】info watchpoints
监控局部变量num:一旦num失效,则监控操作也随即失效。监控指针变量*p: watch *p表示监控p所指数据的变化情况;watch p表示监控p指针本身是否改变指向。监控数组a[10]中的元素:watch a表示只要数组a中元素发生改变,程序就会停止执行。 catch
捕捉断点
bt 查看函数调用堆栈信息,用于发生段错误时,追踪错误
【查看所有线程的调用栈】thread apply all bt
display 【频繁查看变量】display num 程序每暂停一次(遇断点或单步调试),自动打印变量num值
【禁用/启用】disable / enable display num
list默认显示当前行的上5行和下5行的源代码
2、GDB print 高级用法
print命令完整语法格式如下:
(gdb) print [options --] [/fmt] expr //[ ]括起来的部分是可选的,可以使用也可以省略
options : 控制指定输出内容的变量或表达式的值fmt : 指定输出变量或表达式值所采用的格式expr : 指定要查看的变量或表达式
表1 options参数的取值
options参数功能-pretty on | off以便于阅读的格式打印某个结构体变量的值,默认值为 off。该选项等同于单独执行 set print pretty on|off 命令。
表2 /fmt常用的取值
/fmt功能/x以十六进制的形式打印出整数。/d以有符号、十进制的形式打印出整数。/u以无符号、十进制的形式打印出整数。/o以八进制的形式打印出整数。/t以二进制的形式打印出整数。/f以浮点数的形式打印变量或表达式的值。/c以字符形式打印变量或表达式的值。
options 参数和 /fmt 或者 expr 之间,必须用--( 2 个 - 字符)分隔。options 参数还有很多选项可以使用,可自行前往 GDB官网查看。
当 print 命令不指定任何 options 参数时,print 和 /fmt 之间不用添加空格,例如以十六进制的形式输出 num 整形变量的值,执行命令为 (gdb) print/x num。
3、GDB其他命令
3.1 调试多进程常用命令
#设置调试子进程|父进程,默认调试父进程
set follow-fork-mode [child | parent]
#设置fork后是否断开(detach)某个进程的调试
set detach-on-fork [off | on] #off:同时调试父进程和子进程;on:只调试父进程
#让父子进程同时运行
set schedule-multiple on
#查看所有进程信息
info inferiors
#切换到指定进程
inferiors
3.2 调试多线程常用命令
#查看所有线程的信息
info threads
#切换到指定线程
thread
#在行line为线程tid打断点
b
#线程锁定
set scheduler-locking [off | on | step]
-off: 默认值,不锁定其他线程
-on: 调试当前线程时,其余线程锁定,阻塞等待
-step: step单步调试当前线程时,其余线程不执行;但使用其他命令(如next)调试时,允许其他线程执行
3.3 处理信号 — handle命令
#忽略指定信号
handle SIGPIPE nostop
3.4 输出重定向 — tee命令
方式1:
# gdb.sh
(gdb |tee /usr/local/aarch64/info.txt )<< GDBEOF
file /usr/local/aarch64/ioserver/ioserver
handle SIGPIPE nostop noprint
set print pretty on
r
GDBEOF
方式2:
#调试程序a.out, 保存输出信息到文件info.txt
gdb a.out | tee info.txt
3.5 改变程序变量—— set var
#程序运行过程中,修改变量值
set var x=4;
3.6 断点命令列表 —— commands
#让GDB在每次到达某一个断点时自动执行一组命令
commands breakpoint-number //将一下命令添加到指定的断点上
print "111" //commands命令1
print "222" //commands命令2
c //commands命令3:继续执行
end //commands命令结束符
4、GDB自定义命令
GDB自定义命令介绍
GDB中有一个非常强大的功能,允许用户根据具体场景需求自定义命令。具体格式如下:
define cmd_name
command list
end
自定义命令以define开始,后面跟命令名字,并且以end结束。define和end中间是具体的实现逻辑。
与自定义命令相关的几个GDB内建变量:
序号条目描述1$argc自定义命令的参数个数2$arg0自定义命令的第一个参数3$arg1自定义命令的第二个参数4$arg2自定义命令的第三个参数5$argN自定义命令的第N+1个参数
应用1:两数相加
define add
Print $arg0+$arg1
end
在GDB中运行效果如下:
应用2:链表打印
将上述代码保存到一个print-list.gdb脚本文件中,对代码内容解释一下,$arg0 为链表表头,$arg1表示为打印链表的节点个数,$arg2 链表的数据类型,$arg3下一个指针标识。此时在gdb按照下图示意:
按照上述操作,可以方便地打印出链表节点内容。也可以命令定义别名:alias pl=print-list,方便后续调用 。
5、GDB查看调试信息 — GCC的调试选项 -g
一个程序想要进行GDB调试,必须在GCC编译时加上“-g”。大家也许知道,在编译时的优化选项“-Ox”,可以进行不同等级的优化以及精简。同样“-g”也有几个等级可选。
序号条目描述1-g 默认选项,同-g22-g0不生成任何调试信息,和编译时不加“-g”一样3-g1生成最少量的调试信息,这些信息足够用来通过backtrace查看调用栈符号信息。主要是包括了函数声明,外部变量,行号等信息,但是不包括局部变量信息。该选项比较少使用。4-g2生成足够多的调试信息,可以使用GDB进行正常的程序调试,这个是默认选项。5-g3在“-g2”基础上生成更多的信息,如宏定义。
6、GDB内存查看命令-- examine
examine是GDB中x命令的全称,用于检查内存中的内容。
#examine命令的一般格式如下:
x/NFU ADDR
N:希望显示的内存单位数F:显示格式,如:o(八进制)、x(十六进制)、d(十进制)、u(无符号十进制)、t(二进制)、a(地 址)、i(指令)、c(字符)或f(浮点数)。U: 内存单位,如:b(字节)、h(半字,两个字节)、w(字,四个字节)或g(双字,八个字节)ADDR:起始地址
(gdb) examine/4xb 0x40063c
0x40063c: 0x01 0x23 0x45 0x67
# 4xb: 以字节为单位,显示4个单位,以十六进制显示; 0x40063c:内存查看的起始地址
7、查看Coredump文件
前置条件:1)启用coredump生成(2种方式:临时启用和永久生效) 2)可执行文件编译时包含调试符号(gcc -g)
gdb <可执行程序>
常用命令:
命令作用示例输出片段bt 或 where查看崩溃时的调用堆栈#0 0x00007f in func() at file.c:10bt full显示完整堆栈及局部变量var = 0x5info registers查看寄存器值rax = 0x0disassemble反汇编当前函数0x0000555: mov eax, [rbp-4]x/[长度] <地址>检查内存数据0x7ffd: 0xdeadbeef