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 displayinfo 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 用法。
参考资料:
 
posted @ 2026-04-11 10:00  PKICA  阅读(32)  评论(0)    收藏  举报