在GDB调试器中打印数组的所有值,可以通过以下方法实现:
一、静态数组打印
- 直接打印数组名
对于静态数组(如int arr[5]),直接使用p arr命令即可打印全部元素。但需注意默认最多显示200个元素,超出部分会被截断。
(gdb) p arr
$1 = {10, 20, 30, 40, 50}
- 强制显示全部元素
若数组长度超过默认限制,需通过set print elements 0解除限制:
(gdb) set print elements 0
(gdb) p arr # 此时会显示所有元素
二、动态数组(指针形式)打印
- 使用指针+长度语法
对于动态分配的数组(如int *ptr),使用p *ptr@len格式,其中len为元素个数。
(gdb) p *ptr@10 # 打印前10个元素
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
- 结合变量长度
若数组长度存储在变量中(如int a=10),可直接引用变量:
(gdb) p *ptr@a # 打印ptr指向的数组的前a个元素
三、高级显示设置
- 显示数组下标
通过set print array-indexes on开启下标显示,便于定位元素位置:
(gdb) set print array-indexes on
(gdb) p arr
$3 = {[0] = 10, [1] = 20, [2] = 30, [3] = 40, [4] = 50}
- 指定起始索引
使用p buffer[3]@5格式打印从索引3开始的连续5个元素:
(gdb) p buffer[3]@5
$4 = {3, 4, 5, 6, 7}
四、其他场景
- C++ Vector容器:直接使用
p vec命令(需调试符号支持):
(gdb) p vec
$5 = std::vector of length 5 = {100, 200, 300, 400, 500}
- 内存地址转数组:对任意内存地址(如
0x7fff0008c0),使用强制类型转换:
(gdb) p *(int(*)[])0x7fff0008c0@10 # 以int数组形式打印
注意事项
- 若输出被截断,优先检查
print elements的设置。 - 动态数组需确保指针有效且长度不越界。
- 对复杂数据结构(如嵌套数组),可结合
ptype命令查看类型定义。