gdb提供了一个命令" print localx"它打印存储在localx变量中的值。因此,它基本上必须使用符号表来查找映射(localx - > addressx on stack)。我无法理解如何创建此映射。
我尝试了什么 我使用 -save-temps 选项研究了gcc的中间临时文件,并观察到局部变量local1被映射到符号名称" LASF8"。但是,objdump实用工具未显示此符号名称。
上下文: 我正在开发一个项目,需要构建一个pin工具来打印局部变量的访问。给定一个函数,我想说这个地址对应于这个变量名。这需要读取符号表以使地址与符号表条目相对应。 GDB进行精确的反向映射。因此,我想理解同样的事情。
答案 0 :(得分:1)
符号表包含在调试信息中。此调试信息由gcc -g
发出。 gdb读取调试信息以获取符号信息等。
通常,调试信息采用DWARF格式。有关规范,请参阅http://www.dwarfstd.org/。
您还可以使用readelf
更直接地查看DWARF。例如,readelf -wi
将显示ELF文件的主要(" .debug_info")调试信息。
请注意,反向执行映射(即为每个堆栈插槽分配名称)并非易事。首先,并非每个堆栈槽都有一个名称。这是因为编译器可能会将临时值溢出到堆栈。其次,许多本地人将使用DWARF位置表达式来表示他们的位置。这意味着你需要编写一个表达式求值程序(不是很难但也不是很简单);你可以想象(在实践中不太可能但在理论上可能)遇到无法在没有真正的堆栈帧的情况下进行评估的表达式;因此,名称通常只在给定的PC上有效。
我相信gdb bugzilla中有一项功能请求,要求将此功能添加到gdb。