gdb中解引用指针最直接方式是print *ptr,查看数组需用ptr@n语法;watch面板默认只显示ptr@1,多维指针需分层展开;调试信息缺失或rtti禁用会导致字段不可见。

gdb里用print直接解引用指针
最直接的方式是用print命令加*前缀:比如指针变量叫ptr,输入print *ptr就能看到它指向的值。如果ptr是int*,就显示一个整数;如果是char*,默认会当C字符串打印(直到遇到\0)。这招对单个对象或首元素有效,但不自动展开数组。
查看指针指向的数组要用@语法
GDB默认把指针当单个地址处理,不会猜长度。要看到连续内存块,必须显式告诉它“这是N个元素”:
-
print ptr@10:查看ptr起始的10个元素(ptr类型决定每个占几字节) -
print (ptr + 2)@5:从第3个元素开始看5个 -
print *(ptr + 3):单独看第4个元素(等价于ptr[3])
注意:@后面的数字必须是编译期常量——不能是变量n,否则报错Cannot resolve function @。如果长度存在变量里,先print n查出具体值,再手动拼表达式。
Watch面板里看指针数组得写ptr@N,不是只输ptr
VSCode的Watch面板默认只显示ptr的地址或首元素,因为GDB没被明确告知长度。直接加ptr进去,实际等效于ptr@1。
必须手写ptr@20这类形式才能展开。常见坑:
- 构建类型不是
Debug:Release下变量可能被优化掉,Watch里显示<optimized out></optimized>,先确认CMAKE_BUILD_TYPE=Debug - 没加
-g或-g3:编译时漏了调试信息,GDB根本读不到变量地址 - 多维指针如
int** mat:mat@3只显示3个int*地址,要看具体内容得写*(mat+0)@5、*(mat+1)@5分层展开
指针内容显示乱码或字段不可见?检查pretty-printer和RTTI
如果print *ptr出来是一堆十六进制,或者Watch里只显示地址不显示成员,大概率是GDB没加载类型信息:
- 确认编译加了
-g且没加-fno-rtti(RTTI对识别class/结构体字段很关键) - VSCode的
launch.json里setupCommands需启用enable-pretty-printing - 临时验证:在Debug Console里执行
print ptr->field_name,能打印说明字段可访问,只是Watch没配置好
真正麻烦的是自定义类型指针——GDB不知道怎么格式化,@语法只能看到原始内存,看不出语义。这时候print加字段名比Watch更可靠。











