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

问题描述 投票:0回答:5

假设定义:

int a[100]
,输入
print a
,那么gdb会自动将其显示为数组:
1, 2, 3, 4...
。但是,如果
a
作为参数传递给函数,那么gdb会将其视为普通的int指针,输入
print a
将显示:
(int *)0x7fffffffdaa0
。如果我想以数组形式查看
a
,该怎么办?

c gdb
5个回答
170
投票

请参阅此处。 简而言之,您应该这样做:

p *array@len

28
投票

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


17
投票

使用

x
命令。

(gdb) x/100w a

12
投票

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

正如 @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. print/u *my_array@10
    = 无符号整数
  4. print/<format> *my_array@10
    =按照通用
    printf()
    式格式字符串
    打印,
    <format>

以下是我的调试器中的一些真实示例,用于从名为

uint8_t
byteArray
数组中打印 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}

更进一步

@Abdull的评论问题:

对于使用空指针标记数组末尾的基于指针的数组(例如

extern char **environ
),有没有一种方法可以在不指定数组长度的情况下打印数组?

是的,方法有很多。请参阅我的新答案中的小硕士论文:如何在 GDB 中打印整个

environ
变量,其中包含所有 C 或 C++ 程序环境变量的字符串。

参考文献

  1. 如何在GDB中像数组一样查看指针?
  2. GDB 官方文档:Ch. 10.4 人工数组:
  3. https://sourceware.org/gdb/onlinedocs/gdb/Arrays.html
  4. GDB官方在线用户手册:
  5. https://sourceware.org/gdb/onlinedocs/gdb/
  6. 官方GDB在线用户手册(全部在一页,方便搜索!):
  7. https://sourceware.org/gdb/current/onlinedocs/gdb
另请参阅

    我对
  1. gdb 的回答:显示某些数据的类型信息
  2. 我对
  3. 如何在 GDB 中打印整个 environ
     变量(包含所有 C 或 C++ 程序环境变量的字符串)的回答

1
投票

(int[100])*pointer

为我工作,感谢@Ruslan
评论中的建议

© www.soinside.com 2019 - 2024. All rights reserved.