有几种方法可以从 gdb 命令行打印变量的值。
-
print 作用于表达式,并且会进行一些隐式转换,就像 C 一样。
p /t a 在您的示例中会将 a 的值转换为整数并以 2 为基数打印。
你想看看a 的位模式,所以print 有几个选项:
- 您可以将其地址转换为指向与双精度相同长度的无符号整数类型的指针(在您的示例中可能是
unsigned long long 或uint64_t)并取消引用。
(gdb) p /t *(uint64_t *)&a
$6 = 100000001011010110000000000000000000000000000000000000000000000
- 您可以使用
{uint64_t} 更简洁地完成同样的事情。
(gdb) p /t {uint64_t}&a
$7 = 100000001011010110000000000000000000000000000000000000000000000
x 显示给定地址的数据,您可以指定数据类型。 /g 表示一个 8 字节整数。
(gdb) x /tg &a
0x7fffffffded8: 0100000001011010110000000000000000000000000000000000000000000000
如果你使用优化,a 可能会在一个寄存器中,而你将无法获取它的地址,所以以上都不起作用。
(gdb) p {uint64_t}&a
Address requested for identifier "a" which is in register $ymm0
但gdb 支持以各种格式打印 AVX 寄存器的内容,使用类似于 C 数组联合的语法。
(gdb) p $ymm0
$1 = {v8_float = {0, 3.41796875, 0, 0, 0, 0, 0, 0},
v4_double = {107, 0, 0, 0}, v32_int8 = {0, 0, 0, 0, 0, -64, 90,
64, 0 <repeats 24 times>},
v16_int16 = {0, 0, -16384, 16474, 0 <repeats 12 times>},
v8_int32 = {0, 1079689216, 0, 0, 0, 0, 0, 0},
v4_int64 = {4637229872563879936, 0, 0, 0},
v2_int128 = {0x0000000000000000405ac00000000000, 0x00000000000000000000000000000000}}
(gdb) p /t $ymm0.v4_int64[0]
$2 = 100000001011010110000000000000000000000000000000000000000000000