调试指针用 p ptr 解引用看值,p ptr 只显示地址;引用直接 p ref 即可,不可解引用;结构体中指针成员需 访问值,引用成员直接访问;不确定类型时务必用 ptype 验证。

用 p 查指针变量本身,用 p *ptr 看它指向的值
直接 p ptr 输出的是地址(比如 $1 = (int *) 0x7fff5fbff6ac),不是你想看的内容。要看到指针真正指向的数据,必须解引用:p *ptr。如果指针为空(nullptr),GDB 会报错 Cannot access memory at address 0x0,这是正常现象,不是命令写错了。
常见误区:
- 把
p ptr和p *ptr混用,误以为前者能显示目标值 - 对未初始化或已释放的指针执行
p *ptr,触发段错误或 GDB 报错 - 结构体中嵌套指针成员(如
struct Node { int* data; };),写成p node.data—— 正确应是p *node.data
p ref 就够了,引用不需要解引用
C++ 引用在底层不占独立存储空间,只是别名,所以 p ref 直接显示其绑定对象的值,和 p original 效果一致。不需要、也不能写 p *ref —— GDB 会提示 Cannot take address of reference。
注意边界情况:
- 引用绑定到临时对象(如
const int& r = func();),生命周期可能已结束,p r可能显示垃圾值或报错 - 函数参数为引用时,
p命令在函数栈帧内有效;一旦函数返回,该引用失效,GDB 无法访问 - 引用类型本身不可变,但所绑定对象若为非 const,仍可通过
p ref = 42修改原值
结构体/类里的引用和指针成员要分清语法
假设定义:struct S { int x; int& rx; int* px; } s{1, x, &x};,调试时:
-
p s.x→ 显示整数值 -
p s.rx→ 直接显示x的当前值(无需*) -
p s.px→ 显示地址(如0x7fff...) -
p *s.px→ 显示该地址存的整数值
如果结构体指针是 S* ps = &s;,则对应写法是:p ps->rx 和 p *ps->px。漏掉 * 或多加 * 都会导致结果完全不对。
用 ptype 确认类型,避免凭经验猜
当不确定某个变量是指针还是引用,或者结构体成员类型模糊时,ptype var 是最可靠的验证方式。例如:
gdb) ptype s.rx type = int & (gdb) ptype s.px type = int *
特别容易混淆的场景:
- 函数返回引用(
int& get_ref() { ... }),调用后p get_ref()看到的是值,但ptype get_ref()才能看出返回类型是int & - 模板类中引用成员(如
std::vector<int>& vref</int>),p vref.size()可用,但p vref可能只显示地址——此时必须靠ptype vref确认是否真为引用 - typedef 或 using 定义的别名(如
using Ref = int&;),仅看变量名无法判断,ptype是唯一依据
最常被忽略的一点:GDB 不会自动展开引用链。比如 int& r1 = x; int& r2 = r1;,p r2 显示的是 x 的值,但你无法从输出反推它经过了几层引用。需要结合源码上下文和 ptype 才能厘清真实绑定关系。











