gdb无法打印数组的内容

时间:2013-08-12 23:32:01

标签: c arrays gdb

我尝试打印像这样的数组的内容,并且它成功了:

p/x t->arr
$1 = {0x63, 0x61, 0x74, 0x31, 0x2e, 0x6a, 0x70, 0x67, 0x0 <repeats 248 times>}

然而,当我尝试这样的不同方式时:

(gdb) p &t->arr
$2 = (char (*)[256]) 0x60c4d0
 p/100x *0x60c4d0
Item count other than 1 is meaningless in "print" command.

t-&gt; arr在结构中定义为arr [256]。我做错了吗?

3 个答案:

答案 0 :(得分:3)

gdb中,您可以将文字指针值转换为您认为合适的任何类型。因此,如果您想将地址视为指向数组的指针,您可以简单地将其转换为数组,并打印出来。

(gdb) p argv
$1 = (char **) 0x7fffffffe898
(gdb) p *(char *(*)[2])0x7fffffffe898
$2 = {0x7fffffffeae1 "/tmp/a.out", 0x0}

答案 1 :(得分:2)

p/100x *0x60c4d0

在这里,您要求gdb在内存位置0x60c4d0中打印100个元素,这意味着更少,因为内存位置0x60c4d0只能包含一个元素。因此,错误表明除了1以外的任何东西都是没有意义的。

p/256x 0x60c4d0

这给出了从0x60c4d0开始的256个地址,它们将是数组中256个char元素中每个元素的地址。

答案 2 :(得分:0)

有两个方面需要考虑:

  1. 给定指针GDB打印地址而不是指向的地址。 因此,如果你有一个char *类型的变量pc,p将只打印地址。

  2. 取消引用指针变量获取它指向的值,因为GDB可以确定其类型。 因此,如果您打印* pc,您将获得该值,因为类型已知。 另一方面,如果你有char [25]类型的pa,p将知道类型并将其视为一个数组并打印其元素。

  3. 但是,如果您希望GDB将地址视为数组,则必须教它。因此,当您使用数组start作为地址时,GDB现在需要知道类型: - 如果你说它是char *,GDB会打印地址。 - 如果你说它是一个char *并取消引用它,GDB将在该地址打印char值。 - 如果你说它是一个char(*)[25],GDB将打印这些元素。