You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GDB中`maint info symtabs`输出的地址查看symtab结构?

地址含义
  • 输出中所有带类型标识的地址(如(struct objfile *) 0x563c7d6a9320、(struct symtab *) 0x563c7d703e20)均属于GDB自身进程的虚拟地址空间,和你正在调试的目标程序无关。GDB加载目标程序的DWARF等调试信息后,会在自己的内存中创建对应的数据结构来存储编译单元、符号表、行号表等元数据,这些地址就是这些结构实例在GDB进程内的存储位置。
  • 直接访问报Cannot access memory的原因是:GDB默认的内存访问上下文是被调试的目标程序,目标程序的虚拟地址空间中没有对应地址的映射,自然无法读取。
查看对应结构的方法

常规方法(推荐)

直接使用GDB内置的maint系列命令即可格式化输出对应结构的所有字段,无需切换调试上下文:

  • 查看struct symtab结构:执行maint print symtab <对应的地址>,比如示例中的0x563c7d703e20,输入命令maint print symtab 0x563c7d703e20即可得到该符号表的所有属性,包括关联的文件名、行号表、所属编译单元等信息。
  • 其他结构对应的打印命令:
    • struct objfile:maint print objfile <地址>
    • struct compunit_symtab:maint print compunit <地址>
    • struct blockvector:maint print blockvector <地址>

直接查看内存结构的方法

如果你需要查看结构的原始内存布局,需要将运行中的GDB自身作为调试目标:

  1. 在当前运行的GDB实例中执行shell pidof gdb获取当前GDB的进程ID
  2. 新开一个终端,启动新的GDB进程,执行attach <上一步拿到的GDB进程ID>
  3. 如果你使用的是带调试符号的GDB版本,此时就可以执行p *(struct symtab *)0x563c7d703e20这类命令,直接打印结构的字段值。

注意:常规调试场景下使用内置maint命令即可满足需求,仅在调试GDB自身逻辑、做GDB二次开发时才需要用到第二种方法。

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:57:03