【问题标题】:GDB using variable name to access local variable nameGDB使用变量名访问局部变量名
【发布时间】:2014-08-25 10:44:01
【问题描述】:

gdb 提供了一个命令“print localx”,它打印存储在 localx 变量中的值。因此,它基本上必须使用符号表来查找映射(localx -> addressx on stack)。我无法理解如何创建此映射。

我尝试了什么 我使用 -save-temps 选项研究了 gcc 的中间临时文件,并观察到局部变量 local1 映射到符号名称“LASF8”。但是,objdump 实用工具没有显示此符号名称。

背景: 我正在开发一个项目,该项目需要构建一个 pin-tool 来打印局部变量的访问。给定一个函数,我想说这个地址对应这个变量名。这需要读取符号表以将地址对应于符号表条目。 GDB 进行精确的反向映射。因此,我也想理解。

【问题讨论】:

标签: debugging gdb debug-symbols objdump


【解决方案1】:

符号表包含在调试信息中。此调试信息由gcc -g 发出。 gdb 读取调试信息以获取符号信息等。

调试信息通常采用 DWARF 格式。有关规范,请参阅http://www.dwarfstd.org/

您还可以使用readelf 更直接地查看 DWARF。例如readelf -wi 将显示 ELF 文件的主要 (".debug_info") 调试信息。

请注意,反向进行映射(即为每个堆栈槽分配一个名称)并不容易。首先,不是每个栈槽都有名字。这是因为编译器可能会将临时变量溢出到堆栈中。其次,许多当地人将使用 DWARF 位置表达式来表示他们的位置。这意味着您需要编写一个表达式求值器(不难但也不简单);您可以想象(在实践中不太可能,但在理论上可能)遇到无法在没有真正堆栈框架的情况下评估的表达式;最后,这些名称通常只在给定的 PC 上有效。

我相信在 gdb bugzilla 中有一个功能请求要将此功能添加到 gdb。

【讨论】:

  • 感谢您的及时回复。您能否详细说明如何编写表达式求值器来表示局部变量位置?
  • 我无法轻易解释。它有很多部分,特别是如果您使用 GCC 和优化,因为还有许多 GNU 扩展(全部记录在案——但不在正文中)。 DWARF 标准有一整节涵盖了基本的表达式语法。但是还有寻找表达式等。
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2023-04-07
相关资源
最近更新 更多