用x/d查看整数必须显式指定单位(如x/dw、x/dh、x/db),否则默认按4字节读取易误读邻近内存;小端机上x/dw显示逻辑值而非原始字节,验证布局需用x/4xb。

用 x/d 查整数,但要注意单位和字节序
直接用 x/d &var 看整数往往不准——它默认按 4 字节(w)读,但如果你传的是 short 或 char,就会把邻近字节也卷进来。真正安全的做法是显式指定单位,再配格式。
-
x/dw &i:查看int i(4 字节有符号十进制),最常用 -
x/dh &s:查看short s(2 字节),避免高位污染 -
x/db &c:查看char c(1 字节),防止把后面几个字节当整数解析 - 别用
x/d &i(缺单位):GDB 会沿用上次的u,可能错成g(8 字节)或b(1 字节)
x/1dw 和 x/dw 本质一样,但写全更可靠
x/dw &i 中的 1 是默认值,省略不影响结果;但显式写成 x/1dw &i 能提醒自己“只读一个单元”,尤其在批量调试时减少误判。
- 执行
x/1dw &i后按回车,GDB 会从下一个地址继续显示(即&i + 4),不是重复同一地址 - 如果想反复看同一地址,得重新输入完整命令,或先用
display/1dw &i -
x/3dw arr可以一次看数组前三个int元素,比循环p arr[0]@3更贴近内存布局
小端机器上,x/dw 显示的是“解释后”的值,不是字节流
比如 int x = 0x12345678 在 x86_64 上内存存为 78 56 34 12,但 x/dw &x 输出就是 305419896(即 0x12345678 的十进制),不会让你手动拼字节。这点和 x/4xb &x 完全不同。
- 需要验证内存排布时,用
x/4xb &x看原始字节;需要确认变量逻辑值时,用x/dw &x - 若变量是
unsigned int,用x/uw &x更准确,避免符号扩展干扰(比如高位是 1 时,x/dw会显示负数) - 对齐填充区不能靠
x/dw推断——它只读你指定的字节数,不关心结构体 padding
常见错误:把指针地址当值,或把值当地址传给 x
x 命令永远作用于**内存地址**。传错类型会导致 segfault 或乱码:
- 错:
x/dw ptr(ptr是int*,但没加&或解引用)→ 实际查的是指针变量自身存储位置,不是它指向的内容 - 对:
x/dw $rax(寄存器值作地址)、x/dw *ptr(需确保ptr非空)、x/dw &val(变量地址) - 运行时报
Cannot access memory at address...,大概率是传了未初始化指针或栈溢出地址 - 输出一串
0或-1不代表值真为零,可能是地址无效后 GDB 返回的占位符
int 用 w,long long 在 x86_64 上得用 g,差一个字节,值就完全不对。











