75

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

4

5 回答 5

141

这里。简而言之,您应该这样做:

p *array@len
于 2013-01-24T13:19:08.433 回答
26

*(T (*)[N])p其中 T 是类型,N 是元素数,p 是指针。

于 2013-01-24T14:16:09.120 回答
17

使用x命令。

(gdb) x/100w a
于 2013-01-24T13:18:46.813 回答
6

正如@Ivaylo Strandjev 所说,一般语法是:

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

打印前 10 个字节的示例my_array

print *my_array@10

但是,如果这看起来像垃圾,因为它试图将值解释为字符,则可以强制使用不同的格式选项,如下所示:

  1. print/x *my_array@10= 十六进制
  2. print/d *my_array@10= 有符号整数
  3. print/u *my_array@10= 无符号整数
  4. print/<format> *my_array@10= 按照通用printf()格式字符串打印,<format>

这是我的调试器中的一些真实示例,用于从uint8_t名为byteArray. 请注意第一个有多丑,只需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}

就我而言,最好的版本是我将数组打印为无符号整数的最后一个版本,因为它uint8_t毕竟是一个数组:

(gdb) print/u *byteArray@16
$7 = {0, 1, 2, 3, 4, 5, 6, 7, 248, 249, 250, 251, 252, 253, 254, 255}
于 2020-09-25T00:03:20.077 回答
0

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

于 2021-05-22T02:20:56.380 回答