GDB查看指定内存地址的内容——指令x

以下是gdb help中的解释

Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.

Defaults for format and size letters are those previously used.
Default count is 1. Default address is following last thing printed
with this command or “print”.

翻译过来就是:

X/FMT ADDRESS 
  • ADDRESS是需要检测的内存地址的表达式。
  • FMT是一个重复数量,跟着一个格式字母和一个大小字母
    • 重复数量是指需要打印多少个对象
    • 格式字母为, x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char)and s(string)
    • 大小字母b(byte), h(halfword), w(word), g(giant, 8 bytes)
    • 根据格式打印指定数量指定大小的对象。

格式和大小字母的默认值是以前使用的。
默认计数为 1。
默认地址是在使用此命令或“打印”打印的最后一个内容之后。

例子:

#include <stdio.h>

void main()
{
    char a[20] = {0x10, 0x20, 0x30, 0x40, 0x50, 0x60};

    printf("%c\n", a[0]);
}

打印a地址后的20个对象,每个对象1个字节,用16进制显示

(gdb) x/20xb a
0x7fffffffdda0: 0x10    0x20    0x30    0x40    0x50    0x60    0x00    0x00
0x7fffffffdda8: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffddb0: 0x00    0x00    0x00    0x00
### 使用 GDB 查看内存地址或变量地址 在调试程序时,GDB 提供了多种方法来查看内存地址以及变量的存储位置。以下是具体的方法: #### 方法一:通过 `info address` 命令获取变量地址 如果需要查找某个特定变量的地址,可以使用 `info address` 命令。此命令会返回指定变量所在的内存地址。 ```bash (gdb) info address variable_name ``` 例如,在调试过程中输入以下命令可获得变量 `my_var` 的地址[^1]: ```bash (gdb) info address my_var ``` #### 方法二:打印变量及其地址 可以通过 `print` 或者其缩写形式 `p` 来显示变量的内容或者它的地址。要显示变量的地址,可以在变量名前加上取址运算符 `&`: ```bash (gdb) p &variable_name ``` 这将返回该变量的具体内存地址。例如,对于名为 `counter` 的整型变量,执行如下操作即可得到其地址: ```bash (gdb) p &counter ``` #### 方法三:利用指针访问内存区域 当已知某块内存的起始地址并希望检查其中的数据时,可以直接将其作为指针处理。假设有一个指向 int 类型数据的指针位于地址 `0x7fffffffeabc` 上,则可以用下面的方式读取它所指向的值: ```bash (gdb) p *(int *)0x7fffffffeabc ``` 此外还可以一次观察多个连续单元格中的数值,只需调整类型声明后的星号数量以匹配所需的数组维度即可[^4]。 #### 方法四:借助外部工具扩展功能 除了内置的功能外,有时也可以结合操作系统层面的指令辅助分析进程状态下的映射情况。比如调用 Linux 下 `/proc/[pid]/maps` 文件内容展示当前运行实例内的段布局详情。这种方式虽然不属于严格意义上的 GDB 功能范畴之内,但在某些复杂场景下非常有用。 以上就是几种常见的运用 GDB 探索目标程序内部结构的技术手段介绍。 ```python def example_function(): counter = 42 return counter # Debugging session might involve inspecting 'counter' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值