info symbol 用于根据地址反查符号名,查询符号表而非内存内容;需带调试信息的程序(-g编译),否则返回“No symbol matches”;它指出地址所属符号及偏移(如main + 12或global_var + 4),不保证精确对齐,优化后可能失效。

用 info symbol 反查地址对应的变量或函数名
地址反查不是“从内存读值”,而是“从地址找符号名”——info symbol 干的就是这事。它查的是符号表(symbol table),不是运行时内存内容。所以你得先有带调试信息的程序(gcc -g 编译),否则返回类似 No symbol matches 0x555555555149.
- 输入
info symbol 0x7fffffffd708,GDB 会告诉你这个地址落在哪个符号范围内,例如:global_var + 4 in section .data或main in section .text - 注意:它不保证该地址**精确对应**某个变量起始地址;如果地址落在函数内部偏移处,可能只显示函数名 + 偏移量,比如
foo + 12 - 若地址属于未初始化局部变量(栈上),且编译启用了优化(
-O2),符号可能已被优化掉,info symbol查不到任何结果
x 命令才是真正在看地址里的原始内容
很多人混淆“查符号名”和“看内存值”。info symbol 回答的是“这是谁的地盘?”,而 x 才回答“这里存了什么?”。
- 要查看
0x7fffffffd708处的 4 字节原始数据(比如一个int):x/dw 0x7fffffffd708(十进制显示)或x/xw 0x7fffffffd708(十六进制) - 单位必须匹配目标类型:
b(1 字节)、h(2 字节)、w(4 字节)、g(8 字节)。错用会导致读错字节范围,比如对int用x/1xb只看到最低字节,漏掉高位 - 小端机器上,
x/4xb 0x7fffffffd708会按字节顺序逐个显示,但x/w 0x7fffffffd708会把这 4 字节当整体解释为一个整数——二者语义不同,别混用
为什么 print *(int*)0x... 有时失败?
直接强制类型转换解引用看似简单,但极易出错:
- 地址无效(已释放、未映射、越界)→ 触发
Cannot access memory at address 0x... - 地址属于只读段(如
.text)却尝试写入 → 程序崩溃或 GDB 报错 - 地址指向栈帧已销毁的局部变量(比如函数返回后还去读它的旧栈地址)→ 数据随机,甚至触发段错误
- 没有显式类型上下文时,
print可能误判对齐或大小(尤其结构体嵌套场景),不如x明确可控
实际调试中建议组合使用
单一命令很难闭环。典型排查流程是:
- 先用
info symbol 0xADDR确认地址归属(是不是你预期的变量?有没有被优化?) - 再用
x/16xb 0xADDR看原始字节布局,验证是否符合类型预期(比如字符串是否以\0结尾、结构体字段是否对齐) - 最后用
print *(my_struct*)0xADDR(仅当确认安全且类型明确时)辅助理解语义 - 如果地址来自日志或 core dump,且无调试信息,
info symbol会失效,此时只能靠x+ 汇编 + 段信息(info files)交叉推断
最易忽略的一点:地址本身可能来自寄存器(如 $rax),但寄存器值未必是有效内存地址——务必先 info symbol $rax 或 x/1xb $rax 测试可访问性,再深入。


















