gdb 查看指令

使用 x 命令和内存地址:

x (examine) 命令允许你检查内存中的数据。你可以指定要检查的内存地址、格式和单位。

基本语法: x /nfu addr

  • n:要显示的单位数量。

  • f:显示格式(例如,x 表示十六进制,t 表示二进制,d 表示十进制)。

  • u:单位大小(b 表示字节,h 表示半字(16 位),w 表示字(32 位),g 表示巨字(64 位))。

  • addr:要检查的内存地址。

示例: 假设有一个 32 位整数 val,其地址为 0x12345678,你想以 16 位为单位查看:

1
x /2ht 0x12345678

这将显示从 0x12345678 开始的两个半字(16 位)的十六进制值。

结合 p 命令获取地址: 你可以使用 p &变量名 获取变量的地址,然后将其传递给 x 命令。

1
2
3
4
5
6
7
8

#include <stdio.h>

int main() {
int val = 0x12345678;
printf("val = 0x%x\n", val);
return 0;
}

编译并用 GDB 调试:

1
2
gcc -g test.c -o test
gdb ./test

在 GDB 中:

1
2
3
4
5
6
(gdb) break main
(gdb) run
(gdb) p &val
$1 = (int *) 0x7fffffffe0dc
(gdb) x /2ht 0x7fffffffe0dc
0x7fffffffe0dc: 0x5678 0x1234

这里注意字节序,在小端序机器上,低位字节在前,高位字节在后,所以显示为 0x5678 0x1234。
如果想要二进制显示,则使用:

1
2
x /2ht 0x7fffffffe0dc
0x7fffffffe0dc: 0101011001111000 0001001000110100

使用表达式和位运算(对于变量值):

如果你只想查看变量的值,而不需要查看内存,可以使用 C 语言的位运算来提取 16 位部分,然后使用 p/t 显示。

示例:

1
int val = 0x12345678;

在 GDB 中:

1
2
3
4
(gdb) p/t (val & 0xFFFF) // 获取低 16 位
$1 = 0101011001111000
(gdb) p/t ((val >> 16) & 0xFFFF) // 获取高 16
$2 = 0001001000110100

总结:

对于查看内存中的数据(包括变量在内存中的表示),使用 x 命令结合 h (半字) 和 t (二进制) 格式指定符是最直接的方法。
对于只查看变量的值,使用位运算提取 16 位部分,然后使用 p/t 也是一个有效的选择。
选择哪种方法取决于你的具体需求。如果你需要查看变量在内存中的布局(例如,在结构体或数组中),x 命令是更好的选择。如果你只需要查看变量值的不同部分,位运算可能更方便。