如何在 GDB 中像查看数组一样查看指针?

假设定义了: int a[100] Type print a,那么 gdb 将自动将其显示为一个数组: 1, 2, 3, 4...。但是,如果将 a作为参数传递给函数,那么 gdb 将把它当作一个普通的 int 指针,类型 print a将显示: (int *)0x7fffffffdaa0。如果我想以数组的形式查看 a,我应该做什么?

72551 次浏览

使用 x命令。

(gdb) x/100w a

简而言之,你应该做的是:

p *array@len

其中 T 是类型,N 是元素数,p 是指针。

如何使用 gdb调试器从 任何 printf风格的格式中的 任何数组查看或打印 任意数量的字节

作为 @ Ivaylo Strandjev 说,一般语法是:

print *my_array@len
# OR the shorter version:
p *my_array@len

my_array打印前10个字节的示例:

print *my_array@10

[推荐! ]自定义 printf样式的打印格式: 但是,如果上面的命令看起来像垃圾,因为它试图将值解释为字符,您可以强制使用不同的格式选项,如下所示:

  1. print/x *my_array@10 = 十六进制
  2. print/d *my_array@10 = 有符号整数
  3. 无符号整数
  4. 根据一般的 printf()样式的格式字符串<format>打印

下面是我的调试器中的一些实际示例,它们可以从名为 byteArrayuint8_t数组中打印16个字节。注意第一个有多丑,只有 p *byteArray@16:

(gdb) p *byteArray@16
$4 = "\000\001\002\003\004\005\006\a\370\371\372\373\374\375\376\377"


(gdb) print/x *byteArray@16
$5 = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff}


(gdb) print/d *byteArray@16
$6 = {0, 1, 2, 3, 4, 5, 6, 7, -8, -7, -6, -5, -4, -3, -2, -1}


(gdb) print/u *byteArray@16
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}

在我的例子中,最好的版本是使用 print/u将数组作为无符号整数打印出来的最后一个版本,因为它毕竟是一个 uint8_t无符号整数数组:

(gdb) print/u *byteArray@16
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}

由于@Ruslan 在评论中的建议,(int[100])*pointer为我工作