GDB 查看指定地址的内容

本文介绍了GDB中用于查看内存地址值的examine命令(简写x)。详细解释了命令参数n、f、u的功能及用法,包括如何指定显示长度、格式和字节数。同时展示了如何自定义输出格式,以便更细致地分析内存数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/<n/f/u> <addr>

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

<addr>表示一个内存地址。
n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i
$21 = 101

(gdb) p/a i
$22 = 0x65

(gdb) p/c i
$23 = 101 'e'

(gdb) p/f i
$24 = 1.41531145e-43

(gdb) p/x i
$25 = 0x65

(gdb) p/t i
$26 = 1100101
<think>嗯,用户之前问过如何在GDB中获取主程序的地址空间,现在又问如何显示指定地址内容。看来用户可能是在进行内存调试或者逆向工程相关的工作。我需要先回顾一下GDB查看内存的命令。 用户的问题很明确,就是想知道在GDB中如何显示某个地址内容。常用的命令应该是x命令(examine)。不过,用户可能需要不同格式的显示,比如十六进制、字符串或者汇编代码。我得详细说明x命令的不同参数和用法。 首先,要确认用户是否知道地址的具体值,或者是否需要先通过其他方式获取地址。比如,用户可能想查看某个变量的地址内容,或者通过info proc mappings得到的地址范围。不过用户这次的问题直接是显示指定地址,所以重点在x命令的用法。 接下来要考虑的是x命令的格式选项。比如,x/x显示十六进制,x/s显示字符串,x/i显示汇编指令等。需要把这些选项都列出来,并给出示例,这样用户能清楚不同参数的效果。 另外,用户可能不清楚如何指定显示的数据单位大小(b、h、w、g),比如字节、半字、字、双字。这也是x命令的重要部分,需要解释清楚。 还需要提到重复次数参数,这样用户可以一次查看多个单位的内容。例如,x/4xw 会显示4个字长度的十六进制数值。 可能用户会遇到权限问题,比如试图读取未映射的内存区域,这时候GDB会报错。需要提醒用户注意这一点,并建议结合info proc mappings来确认地址的有效性。 此外,用户可能想知道如何查看某个变量的内容,这时候可以用&变量名获取地址,再传递给x命令。比如,x/x &global_var,这样用户可以将变量和地址查看结合起来。 最后,要总结一下常用的组合命令,帮助用户快速记忆和使用。比如查看20个字节的十六进制和ASCII码,或者查看入口点处的汇编代码。 需要确保回答结构清晰,分点说明,每个部分都有示例,这样用户能一步步跟着操作。同时,注意使用中文,避免专业术语过多,必要时进行解释。</think>在 GDB查看指定地址内容的常用方法是使用 `examine` 命令(简写 `x`),以下是详细使用方法: --- ### 🔍 **基础语法** ```gdb (gdb) x/[数量][格式][单位] 地址 ``` --- ### 📌 **参数详解** 1️⃣ **显示数量**(可选) - `x/4x 0x1234` 表示查看 4 个单位的十六进制值 - `x/16c 0x1234` 表示查看 16 个字符 2️⃣ **格式说明符** | 符号 | 说明 | 示例输出 | |------|---------------------|-------------------| | `x` | 十六进制 | 0xdeadbeef | | `d` | 十进制整数 | 3735928559 | | `u` | 无符号十进制 | 3735928559 | | `o` | 八进制 | 033253337357 | | `t` | 二进制 | 0b11011110... | | `c` | ASCII 字符 | 'A' (0x41) | | `s` | C 字符串 | "Hello\\0" | | `i` | 汇编指令 | mov eax,0x1 | | `a` | 地址符号化 | <main+15> | 3️⃣ **单位大小** | 单位 | 说明 | 数据长度 | |------|-----------------|----------| | `b` | byte | 1 字节 | | `h` | half-word | 2 字节 | | `w` | word | 4 字节 | | `g` | giant word | 8 字节 | --- ### 🛠 **实用案例** 1️⃣ **查看内存内容** ```gdb (gdb) x/4xw 0x555555555050 # 查看 4 个 word(4字节)的十六进制值 0x555555555050 <_start>: 0x8949ed31 0x0be58949 0x89485331 0x00000fe3 (gdb) x/8cb 0x7fffffffdc00 # 查看 8 字节的 ASCII 字符和十六进制 0x7fffffffdc00: 72 'H' 101 'e' 108 'l' 108 'l' 111 'o' 0 '\\0' 0 '\\0' 0 '\\0' (gdb) x/s 0x555555556004 # 查看字符串内容 0x555555556004: "Hello World!" ``` 2️⃣ **查看汇编代码** ```gdb (gdb) x/3i 0x555555555050 # 查看 3 条汇编指令 0x555555555050 <_start>: endbr64 0x555555555054 <_start+4>: xor %ebp,%ebp 0x555555555056 <_start+6>: mov %rdx,%r9 ``` 3️⃣ **查看变量地址** ```gdb (gdb) p &global_var # 先获取变量地址 $1 = (int *) 0x555555558018 <global_var> (gdb) x/d 0x555555558018 # 查看地址的十进制值 0x555555558018 <global_var>: 42 ``` --- ### ⚠️ **注意事项** - 若出现 `Cannot access memory at address 0x...` 错误,表示地址无效或不可访问 - 查看代码段地址时建议使用 `x/10i $pc`(查看当前指令附近汇编) - 可配合 `info proc mappings` 确认地址有效性 - 使用 `set print elements 0` 可禁止内容截断 --- ### 💡 **组合技巧** ```gdb # 查看内存布局后选择关注的地址 (gdb) info proc mappings # 查看程序入口点代码 (gdb) info target (gdb) x/10i <Entry point address> # 混合格式查看(十六进制 + ASCII) (gdb) x/20xb 0x7fffffffdca0 # 20字节的十六进制和ASCII ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值