如何使用GDB获取函数的内存范围

时间:2017-07-31 09:46:00

标签: assembly gdb

据我了解,对于程序中的每个函数符号,地址空间中都有相应的内存范围。 call汇编指令在堆栈上推送ip和其他一些信息并跳转到该范围的开头。

我需要在使用GDB进行调试时获得该范围。我可以使用info symbol轻松获取与给定地址或行对应的函数名称。我需要相反的:符号 - &gt;地址范围。事实上,我甚至可以使用TUI模式,将汇编代码滚动到函数的末尾,然后查看&#34; <symbol_name> + <offset>&#34;在最后一条指令附近注释,但这绝对不是正确的方法(因为我使用的是GDB / MI,情况更糟)。

如何使用GDB将符号与其内存范围匹配?

1 个答案:

答案 0 :(得分:1)

  

据我了解,对于程序中的每个函数符号,地址空间中都有相应的内存范围。

给定的“source”函数可能占用0(如果函数从未被调用且链接器垃圾收集它)或链接的ELF图像中的更多地址范围:

  1. 编译器可以自由地将函数拆分为多个部分,每个部分都有自己的地址范围,并且链接器没有义务将这些部分放在一起。海湾合作委员会将这样做,以便例如保持 经常执行的foofoo.hot部分)部分和不经常执行的部分(foo.cold部分)在不同的页面上,以便最大限度地减少TLB刷新。

  2. 反转也是可能的:当经常使用固定的参数值调用foo时,GCC可以复制函数(foo.clone.123)并为该值优化该副本

  3.   

    如何使用GDB将符号与其内存范围匹配?

    要查找范围的开头,只需print &foo

    似乎没有办法在GDB中找到范围的结尾(除了你已经发现的disas命令之外)。在ELF平台上,您可以通过以下方式轻松找到函数的长度。 readelf -Ws | grep foo