Debugging GDB使用变量名访问局部变量名

Debugging GDB使用变量名访问局部变量名,debugging,gdb,debug-symbols,objdump,Debugging,Gdb,Debug Symbols,Objdump,gdb提供了一个命令“print localx”,它打印存储在localx变量中的值。因此,它基本上必须使用符号表来查找映射(localx->addressx-on-stack)。我无法理解如何创建此映射 我尝试的 我使用-save temps选项研究了gcc的中间临时文件,并观察到一个局部变量local1被映射到一个符号名“LASF8”。但是,objdump实用工具没有显示此符号名称 上下文: 我正在做一个项目,需要构建一个pin工具来打印局部变量的访问。给定一个函数,我想说这个地址对应于这个

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

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

上下文:
我正在做一个项目,需要构建一个pin工具来打印局部变量的访问。给定一个函数,我想说这个地址对应于这个变量名。这需要读取符号表以将地址对应于符号表条目。GDB进行精确的反向映射。因此,我想了解同样的情况。

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

调试信息通常采用DWARF格式。有关规格,请参阅

您还可以使用
readelf
更直接地查看DWARF。例如,
readelf-wi
将显示ELF文件的主(“.debug\u info”)调试信息

请注意,以相反的方式进行映射(即为每个堆栈槽指定一个名称)并不完全容易。首先,并非每个堆栈插槽都有一个名称。这是因为编译器可能会将临时变量溢出到堆栈中。其次,许多局部变量将使用矮人位置表达式来表示其位置。这意味着您将需要编写一个表达式计算器(不难,但也不琐碎);可以想象(在实践中不太可能,但在理论上可能)会遇到没有真正堆栈框架就无法计算的表达式;最后,这些名称通常只在给定的PC上有效


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

这可能会有所帮助:感谢您的及时回复。您能详细介绍一下如何编写表达式求值器来表示局部变量的位置吗?我无法解释。其中有很多部分,特别是如果您使用的是GCC和优化,因为还有许多GNU扩展(都有文档记录,但不在正文中)。DWARF标准中有一整节涵盖了基本表达式语法。但是还有找到表达式等等。