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