GDB中用x命令打印连续内存块最直接,需按“数量+格式+单位”顺序指定参数,如x/10dw buffer;print虽支持@语法但依赖类型推导,x更可靠。

用 x 命令打印连续内存块最直接
GDB 里没有“多行”概念,只有按字节/字/双字等单位连续读取内存。关键不是换行,而是控制「重复次数」和「显示格式」。比如你想看 buffer 起始的 10 个 int,就该用 x/10dw buffer,而不是指望它自动分行显示。
-
/10dw中的10是重复次数,d表示十进制,w表示 4 字节(即一个int) - 如果数组是
char data[100],想看前 20 个字符,用x/20cb data(c是字符,b是字节) - 误写成
x/10db buffer就会把每个int拆成 4 个独立字节打印,结果错位且难读
x 的格式参数组合容易混淆
格式字符串形如 /[count][format][size],三部分顺序固定,缺一不可。常见错误是把 size 和 format 位置颠倒,比如写成 x/10wd —— GDB 会报错或静默忽略后缀。
- 正确顺序:数量在前,格式居中,单位在尾,例如
x/5xw 0x7fffffffe000 -
format决定解读方式:x(十六进制)、d(有符号十进制)、u(无符号十进制)、s(字符串)、i(反汇编指令) -
size决定每次读多少字节:b=1、h=2、w=4、g=8;混用size和实际数据类型不匹配会导致值被截断或错读
打印大数组时默认只显示前 200 个元素
直接 print buffer 或 print buffer@1000 时,GDB 默认限制输出长度,超过 200 就截断并提示 <incomplete sequence></incomplete>。这不是内存读取失败,是显示策略。
- 临时解除限制:
set print elements 0(设为 0 表示无限制) - 恢复默认:
set print elements 200 - 更安全的做法是明确指定范围,比如
print buffer[50]@100,只打印从索引 50 开始的 100 个元素,避免一次性刷屏
用 print 打印连续内存要小心指针类型
print 支持 @ 语法(如 print buffer@10),但它依赖变量本身的类型推导。如果 buffer 是 void* 或未声明类型,GDB 可能无法确定单个元素大小,导致结果不可靠。
- 推荐先确认类型:
whatis buffer,若输出是void *,应强制转成具体类型再打印,例如print (int*)buffer@10 -
print显示的是表达式求值结果,而x是纯内存读取,不经过类型系统——调试堆内存或结构体对齐问题时,x更可信 - 遇到字符串或二进制 blob,优先用
x/s或x/20xb,print对非 null-terminated 字符串支持差
真正麻烦的不是命令记不住,而是看到一长串地址+数值后,没法快速对应到你代码里的逻辑位置。建议每次用 x 前,先用 info address buffer 确认起始地址,再结合 ptype 或源码确认元素尺寸,否则很容易把 w 当成 g 用,或者把 u 和 d 弄反,结果数值全错。



















