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

CDT*_*CDT 38 c gdb

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

izo*_*ica 74

看到这里.总之,你应该这样做:

p *array@len
Run Code Online (Sandbox Code Playgroud)

  • 我必须知道 len 的数量,是否可以只使用“命令数组”之类的东西? (3认同)
  • @CodyChan 您可以传递一个更大的数字,并且它_可能_不会崩溃。只是为了让您了解正在发生的事情。 (2认同)

R..*_*R.. 17

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

  • 更简单:`(T[N])*p`。GDB 比 C 更能干;) (6认同)
  • 它首先将 `p` 转换为指向数组的指针类型(而不是指向第一个元素的元素指针类型),然后取消引用该指针以获取数组对象。在 C 中,除了作为 `&` 或 `sizeof` 的操作数外,在大多数上下文中这将衰减回指针,但 gdb 直接使用数组类型来打印数组。 (2认同)

asc*_*ler 9

使用该x命令.

(gdb) x/100w a
Run Code Online (Sandbox Code Playgroud)

  • 这是一个过于具体的解决方案。虽然它适用于带有 `int` 的 OP 用例,但它无济于事,例如,如果数组包含 `struct`。 (3认同)

Gab*_*les 5

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

print *my_array@len
# OR the shorter version:
p *my_array@len
Run Code Online (Sandbox Code Playgroud)

打印前 10 个字节的示例my_array

print *my_array@10
Run Code Online (Sandbox Code Playgroud)

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

  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}
Run Code Online (Sandbox Code Playgroud)

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

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