1、GDB基础命令
命令 | 含义 |
---|---|
r | 重新执行 |
q | 退出gdb |
n | 下一步 |
c | 继续执行 |
b 普通断点 | 打断点 【普通断点】b file.c :行号 【条件断点】b file.c : 行号 if num == 2 【查看断点】info b 【删除断点】del 2 【禁用/启用】disable / enable 2 |
watch 观察断点 | 【监控num】watch num 当被监控变量/表达式的值发生改变时,程序停止运行 【查看观察断点】info watchpoints
|
catch 捕捉断点 | |
bt | 查看函数调用堆栈信息,用于发生段错误时,追踪错误 |
display | 【频繁查看变量】display num 程序每暂停一次(遇断点或单步调试),自动打印变量num值 【禁用/启用】disable / enable display num |
list | 默认显示当前行的上5行和下5行的源代码 |
2、GDB print 高级用法
print命令完整语法格式如下:
(gdb) print [options --] [/fmt] expr //[ ]括起来的部分是可选的,可以使用也可以省略
- options : 控制指定输出内容的变量或表达式的值
- fmt : 指定输出变量或表达式值所采用的格式
- expr : 指定要查看的变量或表达式
options参数 | 功能 |
---|---|
-pretty on | off | 以便于阅读的格式打印某个结构体变量的值,默认值为 off。该选项等同于单独执行 set print pretty on|off 命令。 |
/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 <pid>
3.2 调试多线程常用命令
#查看所有线程的信息
info threads
#切换到指定线程
thread <tid>
#在行line为线程tid打断点
b <line> thread <tid>
#线程锁定
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 | 默认选项,同-g2 |
2 | -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:内存查看的起始地址