gdb查看命令
1. x 检查内存内容
在 GDB 中,x 命令是 Examine 的缩写,专门用于直接查看内存内容。与 print (或 p) 不同,x 命令不受变量类型的限制,可以以任何格式、任何长度解析指定地址的数据。
1.1 x命令语法
x 命令的标准格式如下:x / [数量][格式][单位] [起始地址]
- n (数量):要显示的元素个数(十进制整数)。
- f (格式):数据显示的方式。
- u (单位):每个元素的大小(字节数)。
- addr (起始地址):可以是内存地址(如
0x400500)、变量名(&var)或寄存器($pc)。
1.2 常用参数速查
| 参数项 [6, 8, 10, 11] | 代码 | 含义 |
|---|---|---|
| 格式 (f) | x | 十六进制 (Hexadecimal) |
| d | 有符号十进制 (Decimal) | |
| u | 无符号十进制 (Unsigned Decimal) | |
| t | 二进制 (Binary) | |
| c | 字符 (Char) | |
| s | 字符串 (String) | |
| i | 汇编指令 (Instruction) | |
| 单位 (u) | b | Byte (1 字节) |
| h | Halfword (2 字节) | |
| w | Word (4 字节,默认值) | |
| g | Giant word (8 字节) |
1.3 常见用法示例
- 查看字符串:以字符串格式显示
str指向的内容。(gdb) x/s str - 反汇编查看指令:显示从当前程序计数器 ($pc) 开始的 5 条汇编指令。
(gdb) x/5i $pc - 查看十六进制数组:以十六进制显示起始地址后的 8 个“半字”(16位,即 2 字节)数据。
(gdb) x/8xh 0x7fffffffe000 - 查看字节流:查看变量
data后的 16 个字节。(gdb) x/16bx &data
1.4 进阶特性
- 状态延续 (Sticky Formatting):GDB 会记住你上次使用的格式和单位。如果你只输入
x/4,它会沿用之前的格式和单位,仅改变显示的个数。 - 回车重复:在执行完一次
x命令后,直接按回车键将继续从上次结束的地址显示相同长度和格式的内存。
2. display 自动显示
在 GDB 调试中,
display 命令用于在每次程序暂停(如断点、单步执行 next/step)时,自动显示特定变量或表达式的值。这对于观察循环中变量变化非常有用。2.1 display基础用法
在程序断点处,使用
display 添加需要监控的变量:(gdb) display 变量名
(gdb) display 表达式
示例:
(gdb) break 10 # 在第10行设置断点
(gdb) run # 运行
(gdb) display i # 监控循环变量 i
(gdb) display sum # 监控变量 sum
(gdb) n # 单步执行,每次暂停都会打印 i 和 sum
GDB 会给每个 display 表达式一个编号(如 1: i = 5),以便后续删除或禁用。
2.2 显示格式化
display 也可以结合格式化符号 /fmt 使用,语法为 display/fmt 表达式。 - 十六进制:
display/x 变量名 - 二进制:
display/t 变量名 - 十六进制内存/指针:
display/a 变量名 - 字符:
display/c 变量名
常用格式总结:
display/i $pc:显示当前执行的汇编指令(在单步汇编调试时非常有用)。display/x $eax:十六进制显示寄存器 $eax。
2.3 管理显示列表 (Info/Delete/Undisplay)
- 查看当前显示列表:
info display或info displays。 - 禁用/恢复显示:
disable display <编号>:禁用,不会被打印。enable display <编号>:恢复打印。
- 删除显示:
undisplay <编号>:删除指定的显示条目。delete display <编号>:同上,效果一致。delete display:删除所有 display 表达式。
2.4 display vs print
- print (
p): 一次性打印变量当前值。 - display: 添加到自动打印列表,每次暂停都会自动显示该变量的最新值。
2.5 高级技巧
- 自动查看数组的一部分:
display/10x buf(以十六进制显示 buf 数组前10个元素)。 - 观察结构体:
display *ptr(自动解引用指针,显示结构体内容)。
💡 快速上手示例
(gdb) start
(gdb) display i
(gdb) display n
(gdb) display/x 0x400500 # 显示内存地址的内容
(gdb) info display # 查看所有显示的变量
1: i = 0
2: n = 5
3: 0x400500 = 0x...
(gdb) undisplay 3 # 停止显示内存地址
3. info命令
在 GDB 中,
info 是一个极其强大的“探测”命令,用于查看程序运行时的各种内部状态。它的基本语法是 info <子命令>(可简写为 i <子命令>)。以下是开发中最常用的
info 命令分类:3.1 info查看断点与监控
info breakpoints(或i b): 列出所有断点、观察点及其编号、状态(启用/禁用)和命中次数。info watchpoints: 专门查看已设置的观察点。
3.2 查看变量与函数
info locals: 显示当前函数(栈帧)中所有局部变量的值。info args: 显示当前函数的参数名及其值。info functions: 列出程序中定义的所有函数名。也可以使用正则过滤,如info functions ^my_。info variables: 列出所有的全局和静态变量。
3.3 查看运行状态与堆栈
info stack(或i s): 显示当前的函数调用栈(类似于backtrace)。info frame(或: 显示当前选定栈帧的详细信息,包括内存地址、寄存器保存位置等。i f)info threads: 查看当前所有线程的状态。info program: 查看程序的执行状态(如:正在运行、已停止及停止原因)。info catch:打印出当前的函数中的异常处理信。
其他堆栈相关命令:
backtrace <n>,bt <n>:打印栈顶上 n 层的栈信息backtrace <-n>,bt <-n>:打印栈底下 n 层的栈信息up <n>:向栈的上面移动 n 层down <n>:向栈的下面移动 n 层
3.4 底层与硬件信息
info registers(或i r): 显示通用寄存器的当前值。info all-registers: 显示包括浮点和向量寄存器在内的所有寄存器。info line: 显示源代码行对应的内存地址。例如info line main.c:10。info address(简写i addr)主要用于查找符号(变量或函数)在内存中的具体位置。
3.5 其他有用信息
info display: 查看通过display命令设置的自动显示列表。info signals: 查看 GDB 如何处理各种系统信号(是否停止、是否打印消息)。info sharedlibrary: 列出程序加载的所有共享库及其内存映射地址。
小贴士:
如果不确定某个具体的子命令,可以直接输入
如果不确定某个具体的子命令,可以直接输入
help info 来获取完整的可用信息列表。您当前是在调试多线程程序还是在处理底层汇编?我可以为您推荐更针对性的
info 用法。参考资料:
浙公网安备 33010602011771号