GDB中打印静态数组前N个元素应使用p *array@N语法,因数组名默认为指针,需解引用后指定数量;直接p array@N错误,p array可能触发全量打印导致卡顿。

用 print 直接打印静态数组前 N 个元素
静态数组在编译时大小已知,GDB 能自动识别其类型和长度,所以最简单的方式就是用 print(简写 p)加切片语法:*array@N。这表示“从 array 指向的地址开始,读取 N 个同类型元素”。
-
p *arr@3:打印int arr[10]的前 3 个元素(假设是int类型) -
p *(char*)buf@8:如果buf是void*或类型不明确,需先强制转为具体类型再 @ - 别写
p arr@3——arr本身是数组名,在 GDB 中会被当作指针值(即地址),@必须作用于解引用后的内存块 - 若数组很大但只想看开头几项,
@比print arr更安全:后者可能触发 GDB 尝试打印全部元素,卡顿或崩溃
动态分配数组必须用 *ptr@len 形式
对于 malloc、new 等分配的内存,GDB 不知道长度,print ptr 只会显示指针值,print *ptr 只显示第一个元素。要查前几个,必须显式告诉长度。
-
int *p = malloc(100 * sizeof(int));→p *p@5查前 5 个int - 如果长度存于变量(如
size_t n = 20;),不能直接写*p@n——GDB 不支持运行时变量作为@右侧参数,得先print n看值,再手输数字 - 注意类型匹配:
char *s用*s@10得到 10 个char;若误用*s@10当作int,结果会错位解析
用 x 命令按原始字节查看,绕过类型限制
当数组类型混乱(比如结构体嵌套、对齐异常)、或你想确认内存布局是否符合预期时,x 比 print 更底层可靠。
-
x/6dw &arr[0]:从arr[0]地址开始,以 4 字节有符号十进制显示 6 个值(适合int数组) -
x/8xb buf:把buf当作字节流,显示连续 8 个十六进制字节,排查填充或越界写入 - 常见坑:
x/4w arr和x/4w &arr效果不同——前者把arr当指针值去 dereference,后者取数组首地址,务必加& -
x不做类型检查,也不会触发 C++ 构造函数或重载操作符,纯看内存,适合验证二进制数据
避免 print array 的隐式全量展开
对大数组执行 print arr(无 @)时,GDB 默认尝试打印整个数组。这在调试中极易导致假死、输出刷屏甚至 OOM,尤其当数组声明为 int big[1000000] 却只初始化了前 10 个。
- 永远优先用
*arr@N显式限定范围 - 如果已经卡住,按
Ctrl+C中断输出,再补@重试 - GDB 7.12+ 支持
set print elements 10限制默认打印元素数,但该设置不影响@语法,仅对无修饰的print生效
真正容易被忽略的是:GDB 对数组下标访问(如 p arr[0]@5)不支持——@ 只能跟在解引用表达式后,不能跟在带下标的变量后。想从中间偏移开始看,必须用 p *(arr + 2)@5 或 x/5dw &arr[2]。


















