p ptr显示指针变量存储的地址,p ptr解引用后显示地址处的内容;若ptr未初始化或为null,p ptr会报内存访问错误,而p ptr仍有效;x命令绕过类型系统直接查看原始内存。

直接用 p *ptr 就能打印指针指向的内容,但前提是 ptr 已初始化且地址可访问;否则会报 Cannot access memory at address 0x...。
为什么 p ptr 只显示地址,不是内容
因为 p ptr 打印的是指针变量本身的值——也就是它存储的地址。这就像问“这个信封上写的地址是多少”,而不是“信封里装了什么”。要看到内容,必须显式解引用:* 操作符告诉 GDB 去内存里取那个地址上的数据。
-
p ptr→ 输出类似$1 = (int *) 0x602010 -
p *ptr→ 输出类似$2 = 42(假设该地址存着整数 42) - 如果
ptr是NULL或未初始化,p *ptr会失败,而p ptr仍能成功
x 命令更适合看原始内存布局
当 p *ptr 报错、或你想绕过类型系统直接看字节时,x 更可靠。它不依赖调试信息或变量类型,只认地址和格式。
- 查看
ptr指向的 4 字节整数(十六进制):x/xw ptr - 查看前 8 字节(字符形式):
x/8cb ptr - 查看字符串(自动停在 \0):
x/s ptr - 注意:
x的地址参数可以是变量名(如ptr),它会自动取其值作为地址,等价于x/xw &ptr不对,而是x/xw $ptr或直接x/xw ptr
常见陷阱:类型不匹配导致误读
比如 char *s = "hello",用 p *s 得到 104 'h' 没问题;但若误用 p/x *s,GDB 会把单个 char 当成 int 解释,可能读出 4 字节垃圾值。
- 安全做法:先用
ptype ptr确认指针类型,再决定用p还是x - 对结构体指针:
p *mystruct_ptr能展开成员,x/16xb mystruct_ptr则看到原始内存排布,两者互补 - 数组指针易混淆:
int *arr和int arr[5]在p中行为不同,但x/5dw arr对两者都有效
真正难的不是命令怎么写,而是判断此刻该信得过类型系统(用 p),还是该直面内存(用 x)——这取决于你是在查逻辑值,还是在抠内存损坏、对齐、填充字节这类底层问题。











