GDB无法直接显示动态数组内容,因其仅存储指针而无长度信息;需用print *arr@len显式指定元素个数,len须为当前作用域可求值的整数变量或字面量。

gdb 中 print 无法直接显示动态数组内容
因为 C++ 动态数组(比如 int* arr = new int[10])在内存里只是个指针,print arr 默认只输出首地址,print *arr 只输出第一个元素。GDB 不知道它背后有多大,也不会自动推断长度。
用 print *arr@len 语法展开整个数组
这是最常用、最直接的方式:告诉 GDB “从 arr 指向的地址开始,连续读取 len 个元素”。
-
len必须是整数字面量或能在当前作用域求值的变量(如size),不能是表达式如n+1(除非 GDB 版本 ≥12 且启用了 Python 扩展) - 类型由
arr推导,所以char*数组会按字符打印,int*则按整数——如果想强制按字节看,改用*(char*)arr@N - 示例:
print *arr@5显示前 5 个int;print *(double*)ptr@3强制把ptr当作double*解释
遇到 Cannot access memory at address 怎么办
常见于数组已释放、越界访问、或指针未初始化。不是语法问题,而是运行时状态异常。
- 先确认指针有效:
print arr看地址是否为0x0或明显非法(如0xffff...) - 检查分配是否成功:
print size是否为正,info proc mappings看地址是否落在合法内存段内 - 若用
std::vector,优先用print vec(GDB 自带 pretty-printer 支持),它能自动显示size()和内容,比裸指针可靠得多
用 x 命令做底层内存查看更灵活
当需要控制格式(如十六进制、单字节)、跳过某些元素、或验证对齐时,x 比 print 更底层也更可控。
立即学习“C++免费学习笔记(深入)”;
- 语法:
x/<count><format><unit> address</unit></format></count>,例如x/10dw arr表示“从arr开始,以十进制显示 10 个 word(4 字节)整数” - 常用组合:
x/5xb(5 个十六进制字节)、x/8xg(8 个十六进制 8 字节块,适合long long或指针) - 注意:
x不做类型检查,全靠你保证address和unit匹配,否则看到的可能是错位解释的数据
GDB 对动态数组的支持始终依赖你提供长度信息,没有“自动探测数组边界”这种事——哪怕加了 std::vector 的调试符号,裸指针依然得手动喂长度。



















