GDB命令详解
启动选项
- -cd:设置工作目录
- -q:安静模式,不打印介绍信息和版本信息
- -d:添加文件查找路径
- -x:从指定文件中执行GDB指令
- -s:设置读取的符号表文件
基础命令
命令 | 简写 | gdb功能 | 使用方法及备注 |
---|---|---|---|
list | l | 列出源代码 | 每次接着上次的位置往下列,每次列10行;后接参数表示列出以参数位置为中心上下10行代码 |
run | r | 运行 | 调试开始 |
break | b | 设置断点 | b 断点处 |
delete | d | 删除断点 | delete断点编号 |
disable | disable | 禁用断点 | disable断点编号 |
info | i | 查看信息 | 查看断点i b,等后面详细列举 |
p | 打印变量 | 打印变量,后面详细介绍 | |
display | d | 打印变量 | 在每次程序暂停时打印变量 |
x | x | 显示内存 | x 0x1234567,后面详细介绍 |
frame | f | 查看栈帧 | 查看某个指定栈帧 |
backtrace | bt,where | 查看栈帧 | bt N显示开头N个栈帧, bt -N最后N个栈帧 |
set | set | 改变变量值 | set variable <变量> = <表达式>;比如 set var test=3 |
next | n | 执行下一行 | n;执行到下一行,不管下一行多复杂 |
step | s | 执行下一行 | s;若下一行为函数,则进入函数内部 |
continue | c | 继续 | c为继续的次数,可省略,表示继续一次 |
finish | fi | 执行到当前函数结束 | 执行完成当前函数 |
until | u | 执行到当前代码块结束 | 执行完成代码块 |
列出源代码:list命令
设置断点:break命令
break命令
在指定位置设置断点,命令格式:
(gdb) b position
断点位置position可以使用“行号”“函数名称”“执行地址“等方式指定,如下:
(gdb) b <行号>
(gdb) b <函数名称>
(gdb) b <函数名称>
(gdb) b <代码地址>
对应的实例:
(gdb) b 8
(gdb) b main
(gdb) b *main
(gdb) b *0x804835c
其中,在函数名称前面加“*”符号表示将断点设置在“由编译器生成的prolog代码处”。
查看指令:info命令
(gdb) info args:查看当前函数的参数及其值
(gdb) info line:查看源代码在内存中地址,可以跟行号、函数名
(gdb) info locals:显示当前函数的局部变量
(gdb) info symbol:显示全局变量信息
(gdb) info function:显示所有函数名称
(gdb) info thread:查看线程信息
(gdb) info registers:列举寄存器值
打印变量:print和display命令
print命令
print支持格式化输出,命令格式:
(gdb) p/format variable
支持的format参数格式如下:
格式 | 说明 |
---|---|
x | 显示为16进制 |
d | 显示为10进制 |
u | 显示为无符号10进制 |
o | 显示为8进制 |
t | 显示为2进制数,t表示two |
a | 地址 |
c | 显示为字符 |
f | 浮点小数 |
s | 显示为字符串 |
打印数组
数组变量或地址后加@数组长度
(gdb) p array@4
$35 = {0x1, 0x2, 0x3, 0x4}
打印长度为8的字符数组
(gdb) p *(char *)array@8
display命令
命令格式和print相同,但display命令会在每次程序暂停时(例如单步执行)自动打印出来。
x命令:查看内存
命令格式:
(gdb) x/NFU address
参数格式:
格式 | 说明 |
---|---|
N | 后面FU重复次数 |
F | x(16进制)、c(字符)、s(字符串)、a(地址) 、d(十进制)、i(汇编)、t(二进制) |
U | b(字节)、h(2字节) 、w(4字节)、g(8字节) |
查看栈帧:frame命令和backtrace命令
frame命令
根据栈帧编号或者栈帧地址,打印指定栈帧信息,命令格式:
(gdb) frame spec
该命令可以将 spec 参数指定的栈帧选定为当前栈帧。spec 参数的值,常用的指定方法有 3 种:
- 通过栈帧的编号指定。0 为当前被调用函数对应的栈帧号,最大编号的栈帧对应的函数通常就是 main() 主函数。
- 借助栈帧的地址指定。栈帧地址可以通过 info frame 命令(后续会讲)打印出的信息中看到。
- 通过函数的函数名指定。注意,如果是类似递归函数,其对应多个栈帧的话,通过此方法指定的是编号最小的那个栈帧。
backtrace命令
打印栈帧信息,命令格式:
(gdb) backtrace [-full] [n]
参数格式:
- -full:打印栈帧信息的同时,打印出局部变量的值。
- n:一个整数值。当为正整数时,表示打印最里层的 n 个栈帧的信息;n 为负整数时,那么表示打印最外层 n 个栈帧的信息。
参考
[1] gdb使用详细介绍: https://blog.csdn.net/weixin_37921201/article/details/120117096
[2] gdb命令: http://lnmp.ailinux.net/gdb