我该如何在gdb中检查数组的这一部分切片?

20

我正在进行GDB调试,并有一个长度为20,000的数组。大部分元素都是零,但在索引10000左右有几个感兴趣的元素。不幸的是,当我输入p the_array[10000]@30时,会出现“只有内存中的值才能使用'@'扩展”。那么如何可视化数组的一部分而不必手动请求范围内每个索引的元素,比如40-50个元素的范围?

2个回答

26

我希望这可以工作。实际上它对我有效。我有这个小程序:

int x[10000];

现在在gdb中:

(gdb) p x[50]@3
$2 = {0, 0, 0}

你的问题存在许多细节缺失。可能是你的gdb有bug,也可能是你的数组在某些方面存在异常。gdb版本和"whatis the_array"等信息可能很有意义。


1
关于这个问题有一些重要的事情需要注意,因为它比我愿意承认的次数更容易出错...当你对数组c[9]@5进行切片操作以获取数组c中第9到13个元素时,它们将不会按照[9,10,11,12,13]的索引返回。而是按照[0,1,2,3,4]的索引返回。所以索引0将是c[9],索引1将是c[10],以此类推。当我在使用GDB进行调试时,在VS中将c[9]@5作为监视表达式放入时,结果被索引为0,这让我困惑了很多次。 - Branden Pinney

5

看起来我们不能使用地址扩展内存区域

(gdb) p (struct tfc *)0x1d88a010@100
Only values in memory can be extended with '@'.

但这很好用

(gdb) p *tfc->buckets@100
$87 = {0x0 <repeats 49 times>, 0x7f3b63a1b060, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f3b21816c90, 0x0 <repeats 18 times>, 0x7f3ae97f9e80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f3b49c96760, 0x0 <repeats 14 times>, 0x7f3adb16d8f0}

你可以使用以下代码来打印数组中的数字:print ((unsigned long long*)0x7ffff6ffb000)[0]@20,如果是指针,则使用 print ((void **)0x7ffff6ffb000)[0]@20,只需将类型替换为数组中实际的类型即可。 - Michael Speer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接