






















x 检查内存内容在 GDB 中,x 命令是 Examine 的缩写,专门用于直接查看内存内容。与 print (或 p) 不同,x 命令不受变量类型的限制,可以以任何格式、任何长度解析指定地址的数据。
x 命令的标准格式如下:
x / [数量][格式][单位] [起始地址]
0x400500)、变量名(&var)或寄存器($pc)。| 参数项 [6, 8, 10, 11] | 代码 | 含义 |
|---|---|---|
str 指向的内容。
(gdb) x/s str
(gdb) x/5i $pc
(gdb) x/8xh 0x7fffffffe000
data 后的 16 个字节。
(gdb) x/16bx &data
x/4,它会沿用之前的格式和单位,仅改变显示的个数。x 命令后,直接按回车键将继续从上次结束的地址显示相同长度和格式的内存。display 自动显示在 GDB 调试中,display 命令用于在每次程序暂停(如断点、单步执行 next/step)时,自动显示特定变量或表达式的值。这对于观察循环中变量变化非常有用。
在程序断点处,使用 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),以便后续删除或禁用。
display 也可以结合格式化符号 /fmt 使用,语法为 display/fmt 表达式。
display/x 变量名display/t 变量名display/a 变量名display/c 变量名常用格式总结:
display/i $pc:显示当前执行的汇编指令(在单步汇编调试时非常有用)。display/x $eax:十六进制显示寄存器 $eax。info display 或 info displays。disable display <编号>:禁用,不会被打印。enable display <编号>:恢复打印。undisplay <编号>:删除指定的显示条目。delete display <编号>:同上,效果一致。delete display:删除所有 display 表达式。display vs printp): 一次性打印变量当前值。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 # 停止显示内存地址
在 GDB 中,info 是一个极其强大的“探测”命令,用于查看程序运行时的各种内部状态。它的基本语法是 info <子命令>(可简写为 i <子命令>)。
以下是开发中最常用的 info 命令分类:
info breakpoints (或 i b): 列出所有断点、观察点及其编号、状态(启用/禁用)和命中次数。info watchpoints: 专门查看已设置的观察点。info locals: 显示当前函数(栈帧)中所有局部变量的值。info args: 显示当前函数的参数名及其值。info functions: 列出程序中定义的所有函数名。也可以使用正则过滤,如 info functions ^my_。info variables: 列出所有的全局和静态变量。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 层info registers (或 i r): 显示通用寄存器的当前值。info all-registers: 显示包括浮点和向量寄存器在内的所有寄存器。info line: 显示源代码行对应的内存地址。例如 info line main.c:10。info address(简写 i addr)主要用于查找符号(变量或函数)在内存中的具体位置。info display: 查看通过 display 命令设置的自动显示列表。info signals: 查看 GDB 如何处理各种系统信号(是否停止、是否打印消息)。info sharedlibrary: 列出程序加载的所有共享库及其内存映射地址。小贴士:
如果不确定某个具体的子命令,可以直接输入 help info 来获取完整的可用信息列表。
您当前是在调试多线程程序还是在处理底层汇编?我可以为您推荐更针对性的 info 用法。
参考资料:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。