据我了解,对于程序中的每个函数符号,地址空间中都有相应的内存范围。 call
汇编指令在堆栈上推送ip
和其他一些信息并跳转到该范围的开头。
我需要在使用GDB进行调试时获得该范围。我可以使用info symbol
轻松获取与给定地址或行对应的函数名称。我需要相反的:符号 - &gt;地址范围。事实上,我甚至可以使用TUI模式,将汇编代码滚动到函数的末尾,然后查看&#34; <symbol_name>
+ <offset>
&#34;在最后一条指令附近注释,但这绝对不是正确的方法(因为我使用的是GDB / MI,情况更糟)。
如何使用GDB将符号与其内存范围匹配?
答案 0 :(得分:1)
据我了解,对于程序中的每个函数符号,地址空间中都有相应的内存范围。
给定的“source”函数可能占用0(如果函数从未被调用且链接器垃圾收集它)或链接的ELF图像中的更多地址范围:
编译器可以自由地将函数拆分为多个部分,每个部分都有自己的地址范围,并且链接器没有义务将这些部分放在一起。海湾合作委员会将这样做,以便例如保持
经常执行的foo
(foo.hot
部分)部分和不经常执行的部分(foo.cold
部分)在不同的页面上,以便最大限度地减少TLB刷新。
反转也是可能的:当经常使用固定的参数值调用foo
时,GCC可以复制函数(foo.clone.123
)并为该值优化该副本
如何使用GDB将符号与其内存范围匹配?
要查找范围的开头,只需print &foo
。
似乎没有办法在GDB中找到范围的结尾(除了你已经发现的disas
命令之外)。在ELF平台上,您可以通过以下方式轻松找到函数的长度。 readelf -Ws | grep foo