x命令必须明确三要素:读多少、按什么类型读、从哪开始读,如x/4xb &var;漏写格式修饰符或地址未加&会导致读错位置或报错;默认字长易误用,需按架构选xw(4字节)或xg(8字节)。

直接用 gdb 的 x 命令查,别依赖 IDE 可视化界面——它常隐藏关键细节,比如对齐、符号类型、实际字节值。
gdb 中 x 命令怎么写才不崩
常见错误是漏写格式修饰符或地址没加 &,导致读错位置或报 Cannot access memory。正确写法必须明确三要素:读多少、按什么类型读、从哪开始读。
-
x/4xb &var:从var地址开始,以十六进制字节(b)为单位,读 4 个字节 -
x/2dw ptr:从指针ptr指向地址开始,以有符号十进制字(w= 4 字节)为单位,读 2 个字 -
x/10xg array:读数组首地址起的 10 个八字节块(g),适合long long或指针数组
注意:x 默认按当前架构字长解释内存,x86_64 下 xw 是 4 字节,xg 才是 8 字节;ARM64 同理。误用会看到截断或错位的值。
查看堆内存时为什么总是显示 0x0 或乱码
不是内存为空,而是你没停在正确时机——malloc 返回后立即 x,可能还没赋值;或 free 后还去读,ASan 会拦截但 gdb 不提示,只显示脏数据。
- 确认指针有效:
print ptr看地址非零,再info proc mappings验证该地址在可读内存段内 - 堆块头信息干扰:glibc 的
malloc在用户数据前插元数据,直接x用户地址可能跨到元数据区,建议用heap插件或malloc_stats辅助定位 - 优化干扰:未加
-O0 -g编译时,变量可能被存入寄存器而非内存,&var失效;务必用gcc -O0 -g重编译
想看整个结构体内存布局,不能只靠 print struct_var
print 显示的是“语义解析后”的值,会跳过 padding、隐藏 union 分支、忽略未初始化字段的原始字节。要验实际内存排布,必须用 x 按字节展开。
- 先用
ptype struct_name查结构体定义和偏移,例如确认int a在 offset 0,char b在 offset 4(因对齐) - 再用
x/16xb &struct_var读 16 字节原始内容,对照 offset 手动拆解 - 特别注意 union:
print只显示当前活跃字段,x能看到所有字段共用区域的真实字节,这对调试序列化/网络协议很关键
真正难的是区分“内存里有什么”和“程序认为它是什么”。x 给你字节,print 给你解释——两者不一致时,问题往往出在类型转换、未定义行为或 ABI 差异上,而不是工具本身。











