C语言 如何在GDB中查看类似数组的指针?

ki0zmccv  于 2023-03-29  发布在  其他
关注(0)|答案(5)|浏览(137)

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

pes8fvy9

pes8fvy91#

请参阅here.简而言之,您应该执行以下操作:

p *array@len
webghufk

webghufk2#

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

zbsbpyhn

zbsbpyhn3#

使用x命令。

(gdb) x/100w a
5lhxktic

5lhxktic4#

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

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

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

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

print *my_array@10

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

  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() -style format string<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}
6mzjoqzu

6mzjoqzu5#

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

相关问题