在 GDB 调试器中,x 命令(全称 examine)用于查看指定内存地址的值。其基本语法如下:

x/[选项] <内存地址>

📌 核心参数说明

参数类型 选项 含义 示例
格式 x 十六进制整数 x/x 0x4000
d 十进制整数 x/d 0x4000
u 无符号十进制整数 x/u 0x4000
o 八进制整数 x/o 0x4000
t 二进制整数 x/t 0x4000
c 字符(ASCII) x/c 0x4000
s 字符串(以 \0 结尾) x/s 0x4000
i 汇编指令 x/i 0x4000
单位 b (byte) 1 字节 x/4xb 0x4000
h (half) 2 字节(半字) x/2xh 0x4000
w (word) 4 字节(字,默认单位) x/1xw 0x4000
g (giant) 8 字节(巨字,64位) x/1xg 0x4000
数量 n 显示连续 n 个单位 x/10xw 0x4000

🔍 常用组合示例

  1. 查看地址 0x4000 处的 1 个 4 字节值(十六进制)

    (gdb) x/xw 0x4000
    
    • 输出:0x4000: 0xdeadbeef
  2. 连续查看 4 个字节(十六进制 + 字符形式)

    (gdb) x/4xb 0x4000
    
    • 输出:
      0x4000: 0x41    'A'    0x42    'B'
      0x4002: 0x43    'C'    0x00    '\0'
      
  3. 查看字符串(自动解析直到 \0

    (gdb) x/s 0x4000
    
    • 输出:0x4000: "Hello World"
  4. 查看 10 条汇编指令

    (gdb) x/10i 0x4000
    
    • 输出:
      0x4000: push   %rbp
      0x4001: mov    %rsp,%rbp
      ...
      

⚠️ 注意事项

  1. 省略单位时:默认使用 w(4字节),如 x/x 0x4000 等价于 x/xw 0x4000
  2. 省略数量时:默认显示 1 个单位,如 x/x 只显示 1 个值。
  3. 地址表达式:可直接用变量名或寄存器:
    (gdb) x/x &my_var      # 查看变量 my_var 的地址值
    (gdb) x/x $rsp         # 查看栈指针指向的值
    
  4. 连续查看:按 Enter 键 可重复上一条 x 命令(自动递增地址)。

💡 实用技巧

  • 快速查看栈内存
    (gdb) x/16xw $sp   # 查看栈顶开始的 16 个字(64字节)
    
  • 混合显示格式
    (gdb) x/4xw 0x4000  # 4 个十六进制字
    (gdb) x/4i 0x4000   # 4 条汇编指令
    

通过灵活组合格式/单位/数量,x 命令可高效分析内存数据!


在GDB(GNU调试器)中,x 命令用于检查内存的内容。x 代表 “examine”(检查)。这个命令非常灵活,可以通过不同的参数来控制显示的内存地址、显示格式、显示的数据大小以及要显示的元素数量。

基本语法:

x/[数量][格式][大小] 地址

参数说明:

  1. 数量:要显示的元素数量(十进制整数)。
  2. 格式:指定显示数据的格式。常用格式字符有:
    • x:十六进制
    • d:有符号十进制
    • u:无符号十进制
    • o:八进制
    • t:二进制(即 “two” 的缩写)
    • a:地址(指针)
    • c:字符
    • s:字符串
    • i:指令(汇编语言)
    • f:浮点数
  3. 大小:指定每个元素的大小。大小字符有:
    • b:字节(byte,1字节)
    • h:半字(halfword,2字节)
    • w:字(word,4字节)(在64位系统上,默认是4字节,但也可以使用g表示8字节)
    • g:巨字(giant word,8字节)
  4. 地址:要检查的内存地址。如果省略,则使用上一次x命令之后的下一个地址(即连续使用x命令会按顺序显示)。

注意事项:

  • 如果省略数量、格式或大小中的某些部分,则使用上一次x命令的设置(默认初始设置是:数量为1,格式为十六进制,大小为字)。
  • 地址可以是表达式,例如变量名、函数名,或者是一个十六进制地址(如0x400000)。

示例:

  1. 以十六进制格式查看一个地址(4字节)
    x/wx 0x400000
    
    • w 表示4字节,x表示十六进制格式。
  2. 以十六进制查看10个连续的字节
    x/10xb 0x400000
    
    • 10 表示10个元素,x表示十六进制,b表示每个元素一个字节。
  3. 以字符格式查看一个地址(直到遇到空字符)
    x/s 0x400000
    
    • s 表示字符串,会一直显示直到遇到空字符(‘\0’)。
  4. 以汇编指令格式查看一个地址
    x/5i 0x400000
    
    • 5i 表示显示5条指令(i表示指令)。
  5. 查看某个变量的内存
    x &my_variable
    
    或者指定格式:
    x/d &my_variable   # 以十进制整数查看
    

其他技巧:

  • 重复上一次的x命令:直接输入x(不带参数)或按回车(如果上一条命令是x,则重复执行)。
  • 更改默认的显示格式:例如,set output-radix 16 可以将默认输出基数设为十六进制,但通常直接在x命令中指定格式更方便。

示例演示:

假设我们有一个变量int a = 42;,我们想查看它的内存:

(gdb) p &a   # 获取变量a的地址,假设输出为 0x7fffffffde44
(gdb) x/wd 0x7fffffffde44   # 以4字节(w)十进制(d)查看
0x7fffffffde44: 42
(gdb) x/wx 0x7fffffffde44   # 以4字节十六进制查看
0x7fffffffde44: 0x0000002a

总结:

x 命令是GDB中非常强大的内存检查工具,通过组合数量、格式和大小,可以灵地查看内存内容。熟练掌握x命令对于调试程序尤其是底层程序(如操作系统、嵌入式系统)非常有帮助。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐